【问题标题】:What's wrong with my Eratosthenes sieve我的 Eratosthenes 筛子出了什么问题
【发布时间】:2013-12-02 16:57:04
【问题描述】:

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

【问题讨论】:

  • 筛子,不是围城,埃拉托色尼的围城听起来很有趣:)

标签: java numbers sum primes


【解决方案1】:
for (index=2; index<= (int) Math.sqrt(20000000); index++);
                                                         |     
                                                         Remove this semicolon

【讨论】:

    【解决方案2】:

    这是一个问题:

    index *= k;
    

    假设 k 是 7。您要删除 14、21、28 等。相反,您要删除 7*7、7*7*7、7*7*7*7 等。你' re 改变index的值,这意味着你将跳过后面的数字。

    你想要这样的东西:

    for (int multiple = 2; multiple * index < seq.length; multiple++) {
        seq[multiple * index] = 0;
    }
    

    编辑:啊 - Prabhakaran 在声明 for 循环之后删除 ; 也是正确的。

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

    【讨论】:

    • 所以我尝试使用“index += k;”但总和不知何故是错误的(2000001000000)
    • 刚刚看到编辑的评论。我非常感谢您的帮助,我正在尽我最大的努力自己学习编程,这些提示很有用。谢谢!
    • @user3058243:您根本不想在内部循环中更改index 的值。您要做的就是删除数组中的元素。
    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多