素数算法不起作用

时间:2016-02-23 08:14:44

标签: java loops primes

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(),但我只是想练习这些算法。

2 个答案:

答案 0 :(得分:2)

您不会在内部check循环中增加while变量。修改为:

    while(check<=prime/2){
        if(prime%check==0){
            flag=1;
            break;
        }
        ++check;
    }

一般来说,有很多方法可以改进算法:

  1. 你可以在开始时测试2,然后只是查看奇数(所以check += 2
  2. 你可以在开头计算sqrt(素数),然后只循环直到平方根(as(sqrt(x)+1)^ 2总是高于素数。
  3. 你可以考虑完全不同的算法,记住已经成功测试的素数,并且在测试另一个素数测试时,已经发现素数仅作为除数。这类似于Sieve of Eratosthenes

答案 1 :(得分:1)

您不会在check循环中增加while。现在,每次增加2(除了2之外,在偶数上扫描没有意义)。还有更快的方法,但现在这样做。

此外,您只需要跑到prime的平方根,而不是一半。这样可以加快速度。