打印出100-200000所有的素数
题目:判断100-200之间有多少个素数,并打印出所有的素数清单
算法分析:判断一个整数是不是素数,主要看这个数能不能被比它小的整数整除,比如:3不能被2整除,3是素数;4能被2整除,4不是素数;5不能被2、3、4整除,5是素数;
初始实现:
for (int i = 100; i <= 200000; i++) {
// 循环嵌套遍历被除数
for (int m = 2; m <= i; m++) {
// 判断,如果能被不是自己本身之外的数整除,直接跳出循环
if (i != m && i % m == 0) {
// 退出循环
break;
}
// 判断,此时该数肯定是素数
if (i == m && i % m == 0) {
// 打印该值
System.out.print(i + "\t");
}
}
}
优化思路 1.遍历时尽量避免进入到循环体内,所以针对偶数以及可以被三整除的所有数进行优化;针对偶数的优化可以节省1/2的计算量,针对被三整除的数,节省1/3的计算量 2.一共数的最小公约数一定不大于这个数的平方根 例如 4=22 9=33 因此可以不用遍历所有小于该数的数; 3.配合偶数的优化前面将i++优化为 i=i+2;加速循环。 优化后
private static final long START = 100;
private static final long END = 200000;
public static void main(String[] args) throws UnsupportedEncodingException {
long start = System.currentTimeMillis();
for (long i = START; i <= END; i++) {
if (isPrimeNumber(i)) {
System.out.print(i + "\t");
}
}
System.out.println("cost = " + (System.currentTimeMillis() - start));
long start1 = System.currentTimeMillis();
}
private static boolean isPrimeNumber(long number) {
boolean result = true;
if ((number > 1)) {
//除去2的偶数都是素数
if (number % 2 == 0) {
return false;
} else if (number % 3 == 0) {
return false;
} else {
//循环时排除偶数,加速
double max = Math.sqrt(number);
for (int i = 3; i <= max; i = i + 2) {
if (number % i == 0) {
result = false;
break;
}
}
}
} else {
return false;
}
return result;
}
**
总结
结果是为优化前耗时6.626秒 优化后耗时0.0102秒 计算时间约节省65倍。
**