我想编写一个程序来查找从b到a的所有素数,因此我编写了以下代码(有效):

public static void main(String[] args) {
    int a;
    int c;
    boolean isPrime;

    a = 2;
    c = 0;

    while(a <= 100000 ){
        isPrime = true;
        for (int b = 2;b<a; b++){
            c = a%b ;
            //System.out.println(c);

            if ( c == 0){
                // this stores every not prime number
                isPrime = false;
            }
        }

        if (isPrime){
            System.out.println(a);
        }
        a=a+1;
    }
} // main end


接下来,我尝试编写此代码的变体,但无法正常工作:

public static void main(String[] args) {
    int q;
    int w;
    boolean isPrimeOne = false;

    q = 2;
    w = 0;

    while(q <= 100){
        isPrimeOne = false;
        for (int d = 2; d<q; d++){
            w = q%d;
            if( w != 0 ){
                isPrimeOne = true;
            }
        }
    }

    if(isPrimeOne){
        System.out.println(w);
    }

    w = w+1;
}


在我看来,我的第一和第二个代码非常相似。唯一的区别(我知道)是我在第一个中将isPrime初始化为true,在第二个中将其初始化为false

为什么第一个代码有效而第二个代码无效?

最佳答案

这两个代码示例相似,但是在isPrimeisPrimeOne变量的初始化和处理方面相反。

第一个代码假定在找到一个因子之前,数字是质数(true)。这证明了数字是复合数字,因此将其设置为false并一直保持这种状态,直到循环结束为止。仅需一个因素即可证明它是复合的。

但是,第二个代码假定一个数字是复合(false),直到找到一个不是因数的数字为止。但是,仅仅因为发现数字不是影响因素,并不意味着它是质数。例如。 20没有3作为因素,但是它仍然是复合的。您正在打印w其余的数字,而不是q您正在测试的数字。您正在递增w而不是q,那是在while循环之外而不是在while循环内。

10-08 04:37