使用Java:找到1000以下所有3或5的倍数之和。(我的算法有什么问题?)
我得到266333,但这不是正确的答案。不过,我看不出我的算法有什么缺陷使用Java:找到1000以下所有3或5的倍数之和。(我的算法有什么问题?),java,Java,我得到266333,但这不是正确的答案。不过,我看不出我的算法有什么缺陷 int count = 0; for (int i = 0; i < 1000; i=i+3) { count = count + i; } for (int i = 0; i < 1000; i=i+5) { count = count + i; } System.out.println(count); int count=
int count = 0;
for (int i = 0; i < 1000; i=i+3) {
count = count + i;
}
for (int i = 0; i < 1000; i=i+5) {
count = count + i;
}
System.out.println(count);
int count=0;
对于(int i=0;i<1000;i=i+3){
计数=计数+i;
}
对于(int i=0;i<1000;i=i+5){
计数=计数+i;
}
系统输出打印项次(计数);
编辑:我发布这篇文章是因为我看到其他算法使用模,但不是这样。我觉得这个理论是正确的,但我遗漏了一点。你在重复计算所有3和5的倍数。这是非互斥事件的普遍加法定律的典型例子,因为事件a=“3的倍数数”和B=“5的倍数数”不是互斥的。这意味着它们具有LCM(最小公倍数)15。所以当你计算3的倍数时,你也在计算LCM的倍数(即15)。同样地,当你计算5的倍数时,你再次计算LCM的倍数(即15)
一个非常简单的解决方案是进行第三次循环,但这次是15的倍数,这次是从计数变量中减去i(计数15)。您正在计算15、30之类的数字。。。(3和5的倍数)两次。因此,一种替代方法是减去这些计数,您可以在两个循环之后添加以下循环:
for (int i = 0; i < 1000; i+=15) {
count-=i;
}
for(int i=0;i<1000;i+=15){
计数-=i;
}
您也可以在一个循环中执行相同的操作(效率更高):
for(int i=0;i<1000;i++){
如果(i%15==0)计数+=i;
如果(i%3==0 | | i%5==0)计数+=i;
}
那么,找到重复的数字,然后从计数中减去是一种有效的方法吗?不,不要先加后减。不会那么有效率的。另一种方法是只计算3和5的倍数一次。有关更高效的代码,请参阅更新。无需使用单独的变量。
for (int i = 0; i < 1000; i++) {
if(i%15 == 0) count+=i;
else if(i%3 == 0 || i%5 == 0) count += i;
}