【发布时间】:2016-02-23 08:14:44
【问题描述】:
package coding;
public class Prob7 {
public static void main(String[] args) {
long flag=0;
long counter=0;
long prime;
for(prime=2;;prime++){
System.out.println(counter);
flag=0;
long check=2;
while(check<=prime/2){
if(prime%check==0){
flag=1;
break;
}
}
if(flag==0){
if(counter==10001){
System.out.println(prime);
break;
}
counter++;
}
}
}
}
我想找到第 10001 个素数,我在 for 循环中嵌套了一个 while 循环,以查找它是否是素数。我使用 flag 在循环外进行检查,并在必要时跳出 while 循环。但是控制台没有做任何事情。所以 for 循环的下一行,我输入了System.out.println(counter);for 检查正在发生的事情。计数器打印出来
0
1
2
2
然后停止。我尝试调试,但我无法找出问题所在。 我没有为 for 循环设置条件,因为我有一个 break 语句,如果素数计数器达到 10001,它将跳出循环。
PS:我知道我可以使用 isPrime(),但我只是想练习这些算法。
【问题讨论】:
-
我建议你学习如何调试简单的程序,这个程序有一个直接的错误。如果你不这样做,你会发现很难调试更难的程序。
-
一旦您开始尝试调试多线程应用程序,有时这似乎是不可能的。
-
顺便说一句,你只需要循环到 sqrt(n) 并且在跳过偶数之后你只需要检查奇数,即
for (int check = 3, max = (int) Math.sqrt(prime); i < max; i+=2)这会快得多。