Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java:找到1000以下所有3或5的倍数之和。(我的算法有什么问题?)_Java - Fatal编程技术网

使用Java:找到1000以下所有3或5的倍数之和。(我的算法有什么问题?)

使用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=

我得到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=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;
}