for (i = 0; i <= 1000; i++) {
if ( i % 3 === 0){
console.log(i);
}
if ( i % 5 === 0){
console.log(i);
}
}
我想将i
的每个输出添加到一起。 i.e. 0+0+3+5+6+9+10...+1000
是否有算法执行此操作,或者我只是开始将这些数字中的每一个一起添加?
答案 0 :(得分:7)
从1到 n 的数字之和为
n * (n + 1) / 2
从1到1000的可被3整除的数字之和与从一到1000 / 3
的数字之和相乘,再乘以3.同样,数字的总和从1开始可以被5整除的1000与从1到1000 / 5
的数字相同,乘以5。
我打赌你正在处理的问题是要排除可被15整除的数字:)
编辑 - 为什么这样做?那么,考虑从1到 n 的数字的简单情况;比如,1比100。
1, 2, 3, 4, 5, ... 97, 98, 99, 100
现在,考虑相同的数字列表,但是倒退:
100, 99, 98, 97, ... 4, 3, 2, 1
请注意,当我们从这两个列表中添加对时,我们总是得到101:
100 + 1 is 101
99 + 2 is 101
98 + 3 is 101
...
4 + 97 is 101
3 + 98 is 101
2 + 99 is 101
1 + 100 is 101
所以有100个总和都是一样的,那就是101.如果我们做乘法并除以2,我们就得到了答案:)
现在,可以被3或5整除的数字总和怎么样?好吧,如果你考虑一下,这些数字是什么样的?
3, 6, 9, 12, ... 993, 996, 999
嗯......看起来很像
3 * (1, 2, 3, 4, ... 331, 332, 333)
所以数字1到333的总和是333 * 334 / 2
,如果我们将它乘以3,我们得到1到1000之间可以被3整除的数字之和。相同的是5.如果我们想要删除3和5可以整除的数字的总和,我们计算从1到1000 / 15
的数字之和以及从结果中减去。
哦,还有一件事。如果我们谈论的是整数的总和,我们怎么知道我们除以2的那一步不会给我们留下一小部分?嗯,公式是n * (n + 1) / 2
,请记住。如果n
是奇数,则n + 1
是偶数。因此,乘法将总是涉及一个偶数,所以除以2将永远不会给我们留下一小部分!
答案 1 :(得分:2)
只需在循环外创建一个变量以保持运行总计:
int sum = 0;
for (i = 0; i <= 1000; i++) {
if ( i % 3 === 0){
sum += i; // or sum = sum + i
}
if ( i % 5 === 0){
sum += i; // or sum = sum + i
}
}
console.log(sum);
答案 2 :(得分:1)
如果你想避免在你的总和中计算两次15的倍数:
int sum = 0;
for (i = 0; i <= 1000; i++) {
if ( i % 3 === 0 || i % 5 === 0){
sum += i; // or sum = sum + i
}
}