我的Eratosthenes筛子出了什么问题

时间:2013-12-02 16:57:05

标签: java numbers sum primes

我试图找出所有素数低于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);
    }
}

2 个答案:

答案 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是正确的。

从中学到的一点是,如果您通过代码进行调试,或者使用其他诊断技术(例如添加大量日志记录),您将能够发现这两个问题。学会自己诊断问题非常重要。在解决问题之前,我强烈建议您尝试使用调试器逐步执行现有的损坏的代码,并查看执行不按预期流向何处,或者值是否为不是你所期望的那样。这样你不仅可以学习如何解决这个错误,还可以学习如何修复未来的错误。