Java 什么';我的埃拉托斯特尼筛有什么问题吗
我想找出200万以下的素数之和。 不幸的是,我的Java Eratosthenes筛似乎不能正常工作。我的错误在哪里? 请不要发布完全不同版本的代码,请更正我的错误 以下是我的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]
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;indexfor(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