【问题标题】:Primes and boolean logic素数和布尔逻辑
【发布时间】:2015-06-18 21:55:03
【问题描述】:

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

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

【问题讨论】:

  • 您在第二个中增加 w 而不是 q。
  • 即使是q,实际上在while循环外也是递增的。

标签: java boolean primes boolean-logic


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

这里有四个问题:

  • 您正在递增 w 而不是 q;
  • 您在while 循环之外增加它(检查您是否匹配大括号);
  • 您在每个作业中都反转了 isPrimeOne 与 isPrime 的逻辑,但没有在打印数字的检查中,所以您只为非质数输出一些东西;
  • 您输出的是w 而不是q。

我建议你尽量减少你的变量的作用域,不需要在方法的开头声明所有的变量。如果您在 while 循环内声明 w 和 isPrimeOne,这将防止您在其他地方错误地尝试使用它们。

【讨论】:

    【解决方案3】:

    “在我看来,我的第一个和第二个代码非常相似。唯一的区别(我明白了)是我首先初始化为素数为真,第二个为素数。”

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

    “为什么第一个代码有效,第二个代码无效”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-06
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多