素数 - 困境

时间:2014-10-24 17:28:48

标签: java loops netbeans

我正在尝试检查给定的数字是否为素数。首先使用试验分割法。但该计划表现得非常奇怪。这是我用过的东西。

int no;
no = Integer.parseInt(jTextField1.getText());

for (int i = 2; i < no; i = i + 1) {
   if(no % i == 0) {
      jTextArea1.setText("No. is not prime");
   }
   else {
      jTextArea1.setText("No is prime");
   }
}

程序始终将输出显示为&#34;否为素数&#34;。 我知道这是一个非常微不足道的问题,但我们将不胜感激。

P.S。我正在使用Netbeans。

2 个答案:

答案 0 :(得分:2)

您遇到的问题是您在每次迭代时重置文本。即使您找到了no的除数并将文本设置为表示它不是素数,您仍然会检查其他数字,这些数字不会均匀分配给您的数字。

你想要做的是检查&#39; primeness&#39;每次循环,但只设置一次文本:

    boolean prime = true;
    for (int i = 2; i < no; i = i + 1) {
        if (no % i == 0) {
            jTextArea1.setText("No. is not prime");
            prime = false;
            break;  // once we have found a divisor, we can stop looking
        }
    }
    if (prime) {
        jTextArea1.setText("No is prime")
    }

答案 1 :(得分:1)

问题在于,如果你找到一个除数,你仍然会继续运行循环。

有几种方法可以解决这个问题。最简单的是,当你找到一个除数时,你就退出了循环:

for (int i=2;i<no;i=i+1 ){
    if(no%i==0) {
        jTextArea1.setText("No. is not prime"); 
        break;
    }
    else {
        jTextArea1.setText("No is prime");
    }
}

break立即停止循环。

你还应该意识到,如果i 是一个除数,你将反复调用同一个setText,这实在是不必要的。你可以在循环之前执行一次:

jTextArea1.setText("No is prime");
for (int i=2; i<no; i=i+1) {
    if(no%i==0) {
        jTextArea1.setText("No. is not prime"); 
        break;
    }
}

这样做是将文本设置为"No is prime";然后,如果它找到一个除数,它会将其更改为"No. is not prime",然后退出循环,因为它没有必要继续。 (请注意,这样做意味着如果no为2,它将起作用。在原始代码中,循环根本不会运行,结果是文本区域永远不会被设置为任何东西。)在实践中,我建议使用boolean作为azurefrog,这样文本区域就不会被设置两次(对于大数字,将其设置为"No is prime"然后将其更改为一半第二个可能会令用户感到不安。)