我正在尝试检查给定的数字是否为素数。首先使用试验分割法。但该计划表现得非常奇怪。这是我用过的东西。
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。
答案 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"
然后将其更改为一半第二个可能会令用户感到不安。)