第 5 篇 算法和设计模式
return true; //若一直到最后都没返回,证明它是素数
以上的做法是可以达到目的的,也比较符合素数的定义。但是,效率就很低了,进行
了很多次不必要的循环。例如,一个数字肯定不能被大于它的
1/2
的整数所整除,因此,
改进一下
for
循环的条件,不必遍历那么多次,修改以后如下所示:
for(int i=2;i<num/2;i++){ //循环 num 的二分之一次就够了
...
}
尽管以上的做法已经比较有效率了,但是还不够。对数字敏感一点人就会知道,其实
只需要小于该数字的二次根也是可以达到目的的,因为大于该数字二次根的数字也是不能
整除了,所以,再改进一下
for
循环的条件,代码如下。
for(int i=2;i<Math.sprt(num);i++){ //循环到 num 的二次根次就够了
...
}
注意:以上的代码中还有一个小小的问题,就是每一次循环都进行一次取二次根的操
作,这是会影响效率的。所以,应该在循环之前就把二次根的值取好。
【答案】
该编程题的思路大致如下:
(
1
)完成一个判断某整数是否为素数的方法。
(
2
)循环
1
~
100
。
(
3
)每循环一次就判断一次,返回
true
则打印。
以下是该题目的编程示例:
package ch15;
public class Prime {
//主方法
public static void main(String[] args) {
//遍历 1 到 100
for (int i = 1; i < 100; i++) {
if (isPrime(i)) { //判断是否为素数
System.out.println(i); //打印素数
}
}
}
//判断一个整数是不是素数的方法
private static boolean isPrime(int num) {
if(num == 1) //1 不是素数,直接返回 false
return false;
//从 2 开始到该整数的 2 次根之间遍历
long sprtNum = (long) Math.sqrt(num); //得到该数字的 2 次根
for (int i = 2; i <= sprtNum; i++) {
if (num % i == 0) { //判断是否能除尽
return false; //返回 false
}
}
return true; //返回 true
}
}