【发布时间】:2013-05-24 01:57:07
【问题描述】:
我在编写一个查找 2-50 之间素数的程序时遇到了麻烦。我的程序现在找到“大部分”素数,但包括一些非素数。我知道有很多更有效的方法和策略可以找到素数,但在我转向更有效和更有效的策略之前,我会先尝试所有可能性。现在编写程序的方式,如果它确实找到了一个素数,它会打印多次,而我只希望它打印一次。我的程序在概念上是正确的还是我的理由有缺陷。为什么我的程序主要找到素数但抛出一些非素数?为什么我的程序会多次打印素数?
这是我解决问题的方法。
创建一个 for 循环来表示 2-50 之间的潜在质数。用变量“i”表示这些潜在的素数。此循环将从 50 开始倒计时。
由于一个数只有在除了它自己和 1 之外没有其他可整除数时才是素数,我想创建一个内部 for 循环来将 i 除以 2 和 i -1 之间的每个可能的数,看看是否有这些数字均分为 i。用变量 j 表示这些可能的除数。如果在任何时候 j 确实均匀地划分为 i 它不是质数,所以我希望我的内部循环退出。
如果 i 除以 j 的所有数字,并且没有数字可以均匀地除以 i,那么如果是素数,则该数字要打印该数字。
*
import acm.program.*;
public class PrimeNumber extends ConsoleProgram{
public void run(){
for (int i =50; i >= 2; i--){
for (int j= 2; j < i-1; j++){
if (i % j >= 1){
println(i);
}else{
if (i % j == 0) break;
}
} /*end of inner loop */
} /* end of for loop */
} /* end of run method */
}
【问题讨论】:
-
2 和 i -1 这太多了,你可以检查 2 和 sqrt(i) 之间的除法。
-
要使该算法起作用,对于所有内部循环情况,i%j 必须 >= 1,而不仅仅是一个。正如 cerkiewny 指出的那样,您只需转到 sqrt(i) 即可减少循环迭代。
-
内循环中的i++一定是错字?
-
呵呵... cmets 比答案快...击败我。
-
@Radio- 不,不是错字。我希望外循环倒计时,内循环倒计时。因此,例如要测试 50,我想要 50 % 2...3...4.. 一直到 50 % 49。