素数和布尔逻辑

时间:2015-06-18 21:55:04

标签: java boolean primes boolean-logic

我想编写一个程序来查找从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

为什么第一个代码有效,第二个代码没有?

3 个答案:

答案 0 :(得分:2)

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

第一个代码假设一个数字是素数(true),直到找到一个因子。这证明了数字是复合的,所以它被设置为false并且它一直保持这种方式直到循环结束。只需要一个因素来证明它是复合的。

但是,第二个代码假定一个数字是复合的(false),直到找到一个不是因子的数字。但仅仅因为发现一个数字不是一个因素并不意味着它是最重要的。例如。 20没有3作为因素,但它仍然是复合的。您正在打印w,其余部分,而不是q,您正在测试的数字。您正在递增w而不是q,这超出了while循环,而不是while循环内部。

答案 1 :(得分:0)

这里有四个问题:

  • 您正在递增w而不是q;
  • 你将它递增到while循环之外(检查你是否匹配大括号);
  • 你已经在每个作业中反转了isPrimeOne相对于isPrime的逻辑,但是没有检查打印数字,所以你只输出非素数的东西;
  • 您输出w而不是q

我建议你尽可能地减少变量的范围,不需要在方法的开头声明所有变量。如果您在w循环中声明isPrimeOnewhile,则会阻止您尝试在其他位置错误地使用它们。

答案 2 :(得分:0)

“在我看来,我的第一个和第二个代码非常相似。唯一的区别(我看到)是我初始化的首先是真正的首先,并且作为假的第二个是素数。”

其实不是。这两个项目有很多不同之处。只需对每一行做一个简单的比较,你就会发现它们。

“为什么第一个代码工作而第二个代码不起作用”

因为第一个程序遵循一个有效的算法来查找素数。第二个程序不遵循任何此类算法。有关详细信息,请参阅rgettman的回答。