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);
用来检查发生了什么。计数器打印出来
0
1
2
2
然后停下来。我试过调试,但我无法弄清楚问题。 我没有为for循环设置条件,因为我有一个break语句,如果素数的计数器达到10001,它将突破循环。
PS:我知道我可以使用isPrime(),但我只是想练习这些算法。
答案 0 :(得分:2)
您不会在内部check
循环中增加while
变量。修改为:
while(check<=prime/2){
if(prime%check==0){
flag=1;
break;
}
++check;
}
一般来说,有很多方法可以改进算法:
check += 2
)答案 1 :(得分:1)
您不会在check
循环中增加while
。现在,每次增加2(除了2之外,在偶数上扫描没有意义)。还有更快的方法,但现在这样做。
此外,您只需要跑到prime
的平方根,而不是一半。这样可以加快速度。