我试图找出所有素数低于200万的总和。 不幸的是,我的Java Eratosthenes筛子似乎不能正常工作。我的错误在哪里? 请不要发布完全不同版本的代码,只需更正我的错误。
这是我的Java代码:
public class Euler10 {
public static void main(String args[])
{
int index;
int k;
int seq[]= new int[2000001];
for (int i=0; i<seq.length; i++)
{
seq[i] = i;
}
for (index=2; index<= (int) Math.sqrt(20000000); index++);
{
if (seq[index]!=0)
{
k= index;
while (index<=(int) Math.sqrt(20000000))
{
index *= k;
seq[index]=0;
}
}
}
long somma =0;
for (int siq:seq)
somma +=siq;
System.out.println("somma "+somma);
}
}
答案 0 :(得分:3)
for (index=2; index<= (int) Math.sqrt(20000000); index++);
|
Remove this semicolon
答案 1 :(得分:2)
这是一个问题:
index *= k;
假设k
是7.你想删除14,21,28等。相反,你要删除7 * 7,然后是7 * 7 * 7,然后是7 * 7 * 7 * 7等。您还更改了index
的值,这意味着您将跳过以后的数字。
你想要这样的东西:
for (int multiple = 2; multiple * index < seq.length; multiple++) {
seq[multiple * index] = 0;
}
编辑:啊 - 和Prabhakaran在宣布;
循环后删除for
是正确的。
从中学到的一点是,如果您通过代码进行调试,或者使用其他诊断技术(例如添加大量日志记录),您将能够发现这两个问题。学会自己诊断问题非常重要。在解决问题之前,我强烈建议您尝试使用调试器逐步执行现有的损坏的代码,并查看执行不按预期流向何处,或者值是否为不是你所期望的那样。这样你不仅可以学习如何解决这个错误,还可以学习如何修复未来的错误。