Java——素数算法返回16

Java——素数算法返回16,java,primes,Java,Primes,我想让这个Java程序流式处理10001个素数,但它莫名其妙地决定将16标记为素数 这里的算法只是保持一个素数的运行计数,并检查每个新的数,看看它是否可以被任何小于它的素数整除。如果不是,则将其添加到数组primes[],该数字显示在控制台上,该过程继续,直到primes[]满为止 public static void main(String[] args){ int[] primes = new int[10001]; int primeCount = 1; int t

我想让这个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++;

    }
}
publicstaticvoidmain(字符串[]args){
int[]素数=新的int[10001];
int primeCount=1;
int testNumber=3;
素数[0]=2;
而(素数<10001){
对于(int i=0;i
控制台读数:

3 5 7 11 13 16 17 19 . . . 3. 5. 7. 11 13 16 17 19 . . .
除16号外,其他一切看起来都井然有序。。。有什么想法吗?

你应该设置
i=-1
而不是
i=0
,因为你将
i
的值设置为零后会立即增加


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

这是您程序的固定版本

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++;

        }
    }
publicstaticvoidmain(字符串[]args){
int[]素数=新的int[10001];
int primeCount=1;
int testNumber=3;
素数[0]=2;
而(素数<10001){
对于(int i=0;i
从软件编程的角度来看,您不应该在while循环中使用For循环。你应该循环,直到你看到它不是素数,或者你检查所有的可能性,并认为它是一个首要的COS你找不到任何分频器。因此,在更大的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++;
        }

    }
}
publicstaticvoidmain(字符串[]args){
int[]素数=新的int[10001];
int primeCount=1;
int testNumber=3;
素数[0]=2;
而(素数<10001){
布尔值isPrime=true;
int i=0;
while(isPrime&&i
您是否将16与2进行对比?似乎你的代码没有检查2(质数)。听说过埃拉托斯提尼筛吗?为什么要制定一个新的、不正确的算法@krico听起来很像。我认为你们应该重新考虑算法的设计。虽然它可以工作(在设置i=-1之后),但它完全不可读。在for循环中更改i从来都不是一个好主意。这将在将来给您带来很多麻烦。如果您在for循环的内部使用变量i,并且在每个循环后都设置为递增,那么您真的不应该在循环中接触i值。这不是很好的编码。