质数(素数)的寻找算法优化
质数(素数)的概念:
- 简单的理解:
- 就是只能够被1和它本身整除的数。
需求:
查找任意给定整数N范围内的所有质数(素数 )
- 就是只能够被1和它本身整除的数。
代码优化过程
代码块01
public static void findPrimeNumbers01() {//偶数能被2正数,刨除偶数,只计算奇数中的素数
int count = 0;
for (int i = 1; i < 200; i += 2) {
int j;
for (j = 2; j <= i/2; j++) {//且 除数大于被除数的一半时不能被整除(商为1,有余数)
if (i % j == 0) {
break;
}
}
if (j>i/2) {
count++;
System.out.print(i+" ");
}
}
System.out.println();
System.out.println("素数个数是: " + count);
}
- 改进思想
- 1x9=9 3x3=9 3 3x3=9 9x1=9
- 112=12 26=12 34=12 3.4 43=12 6*2=12
- 当除数增至被除数的平方根时,被除数的两个因数位置互换
代码块02
public static void findPrimeNumbers02() {
int count = 0;
for (int i = 1; i < 200; i += 2) {
int j;
for (j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
break;
}
}
if (j>Math.sqrt(i)) {//当除数增至被除数的平方根时,被除数的两个因数位置互换
count++;
System.out.print(i+" ");
}
}
System.out.println();
System.out.println("素数个数是: " + count);
}
优化完成代码
- 优化思路
- 基于上一步
- 遍历变成 由两端开始,向中间靠拢 的方式向中间遍历
代码块03
public static void findPrimeNumbers03() {
int count = 0;
System.out.print(1+" ");
System.out.print(2+" ");
for (int i = 3; i < 200; i += 2) {
int j;
int squareRoot=(int)Math.sqrt(i);
int maxCircle =(squareRoot+2)/2;//解决开方数为奇数时边界值未被覆盖问题
for (j = 2; j <= maxCircle; j++) {
if (i % j == 0 || i%(squareRoot-j+2)==0) {//+2原因:需要由 0 开始减
break;
}
}
if (j>maxCircle) {
count++;
System.out.print(i+" ");
}
}
System.out.println();
System.out.println("素数个数是: " + count);
}