Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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 什么';我的埃拉托斯特尼筛有什么问题吗_Java_Numbers_Sum_Primes - Fatal编程技术网

Java 什么';我的埃拉托斯特尼筛有什么问题吗

Java 什么';我的埃拉托斯特尼筛有什么问题吗,java,numbers,sum,primes,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]

我想找出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);
    }
}
公共类Euler10{
公共静态void main(字符串参数[])
{
整数指数;
int k;
整数序列[]=新整数[2000001];
对于(int i=0;i这是一个问题:

index *= k;
假设
k
为7。您想删除14、21、28等。取而代之的是删除7*7、7*7*7、7*7*7等。您还更改了
index
的值,这意味着您将跳过后面的数字

你想要的是:

for (int multiple = 2; multiple * index < seq.length; multiple++) {
    seq[multiple * index] = 0;
}
for(int multiple=2;multiple*index
编辑:啊-而且Prabhakaran在声明
for
循环之后删除
是正确的

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

这是一个问题:

index *= k;
for (index=2; index<= (int) Math.sqrt(20000000); index++);
                                                         |     
                                                         Remove this semicolon
假设
k
为7。您想删除14、21、28等。取而代之的是删除7*7、7*7*7、7*7*7等。您还更改了
index
的值,这意味着您将跳过后面的数字

你想要的是:

for (int multiple = 2; multiple * index < seq.length; multiple++) {
    seq[multiple * index] = 0;
}
for(int multiple=2;multiple*index
编辑:啊-而且Prabhakaran在声明
for
循环之后删除
是正确的


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

for(index=2;index
for(index=2;indexsieve,不是围攻,围攻埃拉托斯提尼听起来很有趣:)筛,不是围攻,围攻埃拉托斯提尼听起来很有趣:)所以我尝试了“index+=k”;但总的来说是错误的(200001000000)刚刚看到编辑后的评论。我非常感谢您的帮助,我正在尽最大努力自学编程,这些提示非常有用。谢谢!@user3058243:您根本不想更改内部循环中
index
的值。您所要做的只是删除数组的元素。因此我尝试使用“index+=k;”但是,刚刚看到编辑后的注释时,总和不知何故是错误的(200001000000)。我非常感谢您的帮助,我正在尽我所能自学编程,这些提示非常有用。谢谢!@user3058243:您根本不想在内部循环中更改
index
的值。您所要做的只是删除数组中的元素。
for (index=2; index<= (int) Math.sqrt(20000000); index++);
                                                         |     
                                                         Remove this semicolon