java – 有人可以解释这个实现是如何工作的吗?还有,它会变得更好吗?怎么样?

public class Main { 
    public static void main(String args []){ 
        long numberOfPrimes = 0; //Initialises variable numberOfPrimes to 0 (same for all other variables)
        int number = 1; 
        int maxLimit = 10000000; 
        boolean[] sieve = new boolean[maxLimit]; //creates new boolean array called sieve and allocates space on the
                                                //stack for this array which has maxLimit spaces in it 
        for ( int i = 2; i < maxLimit; i++ ) { //for statement cycling from 2 to 10000000, does not execute the rest
                                              //of the block if the boolean value in the array is true 
            if ( sieve[i] == true ) continue; 

            numberOfPrimes++; //otherwise it increments the number of prime numbers found

            if ( numberOfPrimes == 10001 ) {  //if 10001st prime number is found, break from loop
                number = i; 
                break; 
            } 

            for ( int j = i+i; j < maxLimit; j += i ) //do not understand the point of this loop logically
                sieve[j] = true;                      //testing if the value in the array is true again?
        } 
        System.out.println("10001st prime: "+ number); 
    } 
    }

我真的不明白这个程序发生了什么,希望有人可以向我解释一下吗?我已经评论了导致我麻烦的具体线路/我理解的线路.非常感谢您的帮助! 🙂

最佳答案
是的,这是Eratosthenes’Sieve的基本实现.有很多方法可以改进它,但让我们首先回顾一下基本原理.

你正在做的是创建一个布尔值数组.数组中的INDEX表示我们正在测试的数字,以查看它是否是素数.

现在,您将开始检查每个数字以查看它是否为素数.首先,素数的定义是“所有数字本身都可以被整除,而没有分数就是1”.

for ( int i = 2; i < maxLimit; i++ )

你从INDEX 2(数字3)开始,因为根据你的定义,1和2总是素数. (有些定义说1不是素数).

if ( sieve[i] == true ) continue;

如果一个数字先前已被标记为非素数,我们不会打扰当前的迭代.

numberOfPrimes++;

        if ( numberOfPrimes == 10001 ) {
            number = i; 
            break; 
        }

如果我们目前的INDEX没有被标记为素数,那么它必须是1,所以我们增加了我们找到的素数.我假设的下一段代码是程序要求的一部分,该程序要求如果找到10001个素数,程序必须退出.如果您确实要检查最多为最大数量的素数而不是特定数量的质数,则可以省略该部分.

for ( int j = i+i; j < maxLimit; j += i )
            sieve[j] = true;

这是筛子真正的魔力开始的地方.从素数的定义来看,如果一个数可以被除了它本身以外的任何东西整除,那么它就不能成为素数.因此,对于我们发现的任何新数,我们可以将它的所有因子都标记为不是素数.例如,for循环的第一次迭代,我们从3开始.因为sieve [2]是假的(之前没有访问过),所以它是一个素数(AND 3 IS A PRIME!).然后,3的所有其他因素不能是素数.上面提到的for循环遍历整个筛子,并将3的所有因子都标记为假.所以这个循环会做:筛[5] =真;筛[8] =真……直到筛子结束.

现在,当您达到大于最初定义的最大值的第一个数字时,您可以确定任何具有因子的数字已被标记为不是素数.你最终得到的是一个布尔数组,其中每个标记为false的索引代表一个素数.

您可以在维基百科上获得更好的描述,但这是它的主旨.希望能帮助到你!

转载注明原文:java – 有人可以解释这个实现是如何工作的吗?还有,它会变得更好吗?怎么样? - 代码日志