一、暴力破解法
解题思路
- 从2开始遍历每一个数字
- 如果这个数组从2到n有一个数能够整除,那么这个数字就位合数
- 否者,这个数字则为素数。
public static int bf(int num) {
int count = 0;
for (int i=2; i<= num; i++) {
count+= isPrime(i)?1:0;
}
return count;
}
private static boolean isPrime(int num) {
for (int i = 2; i*i <= num; i++) {
if (num%i==0) {
return false;
}
}
return true;
}
二、埃筛法
解题思路
- 使用一个布尔数组,默认数组中的都为false;
- 数组中的每一个值对应n范围内的一个值;
- 从2开始循环遍历每一个值。
- 对应数组下标,如果该值为flase,那么进入下一层遍历;
- 下一层遍历是根据数学中的特点,如果判断到了2,那么22,23的乘积肯定不是素数,那么可以提前数组中的值为true,减少遍历循环。
public static int eratosthenes(int n) {
boolean[] flag = new boolean[n]; //默认全部为素数
int count = 0;
for (int i = 2; i< n; i++) {
if (!flag[i]) {
count++;
for (int j = i*i ; j<n; j+=i) {
flag[j] = true;
}
}
}
return count;
}