2

我希望这个 Java 程序流式传输 10001 个素数,但它莫名其妙地决定将 16 标记为素数。

这里的算法只是保持素数的连续计数,并检查每个新数字以查看它是否可以被任何小于它的素数整除。如果不是,则将其添加到数组 primes[ ] 中,该数字显示在控制台上,并且该过程继续进行,直到primes[ ]已满。

public static void main(String[] args){
    int[] primes = new int[10001];
    int primeCount = 1;
    int testNumber = 3;
    primes[0] = 2;
    while(primeCount < 10001){
        for (int i = 0; i < primeCount; i++){
            if (testNumber % primes[i] == 0){
                i = 0;
                testNumber++;
            }
        }
        primes[primeCount] = testNumber;
        System.out.println(testNumber);
        primeCount++;
        testNumber++;

    }
}

控制台读数:

   
3
5
7
11
13
16
17
19
.
.
.

除了 16 个,其他一切看起来都井井有条……有什么想法吗?

4

3 回答 3

6

您应该设置i = -1,而不是因为在将其设置为零后i = 0立即增加值。i

我建议您重新思考for循环的工作原理。

于 2013-02-24T21:18:52.550 回答
4

从软件编程的角度来看,您不应该在该 while 循环中使用 for 循环。您应该循环直到您发现它不是质数,或者您检查所有可能性并认为它是质数,因为您找不到任何除法器。所以你应该在更大的while里面有一个while循环。我是说:

public static void main(String[] args) {
    int[] primes = new int[10001];
    int primeCount = 1;
    int testNumber = 3;
    primes[0] = 2;
    while (primeCount < 10001) {
        boolean isPrime = true;
        int i = 0;
        while (isPrime && i < primeCount) {
            if (testNumber % primes[i] == 0) {
                i = 0;
                testNumber++;
                isPrime = false;
            } else {
                i++;
            }
        }
        if (isPrime) {
            primes[primeCount] = testNumber;
            System.out.println(testNumber);
            primeCount++;
            testNumber++;
        }

    }
}
于 2013-02-24T21:31:27.537 回答
0

这是您程序的固定版本

public static void main(String [] args){

        int[] primes = new int[10001];
        int primeCount = 1;
        int testNumber = 3;
        primes[0] = 2;
        while(primeCount < 10001){
            for (int i = 0; i < primeCount; i++){

                if (testNumber % primes[i] == 0){
                    i = -1;
                    testNumber++;
                }
            }
            primes[primeCount] = testNumber;
            System.out.println(testNumber);
            primeCount++;
            testNumber++;

        }
    }
于 2013-02-24T21:27:47.163 回答