基础算法练习:统计一定范围内素数的个数
/**
* @author JH_Y
* @version 1.0
*/
public class CountPrimeNumber {
public static void main(String[] args) {
/*
* 统计一定范围内素数的个数
* 提示: 素数是只能被1和自身整除的自然数, 注意: 0、1除外
* 例:输入:100
* 输出:25
*/
System.out.println("暴力破解素数个数为 :" + blast(5));
System.out.println("埃筛法解素数个数为 :" + essayMethod(5));
}
// 暴力破解
public static int blast(int num) {
int count = 0;
//注意: 0、1除外 ,循环从2开始
for (int i = 2; i < num; i++) {
count += isPrime(i) ? 1 : 0;
}
return count;
}
//判断时是否为素数 , 输入数n只要能被 2~(n-1)整除,就不是素数
public static boolean isPrime(int x) {
for (int i = 2; i * i <= x; i++) { // 这里 i <= Math.sqrt(x) 或者 i*i <= x 其实就可以了
if (x % i == 0) {
return false;
}
}
return true;
}
/*
素数 , 非素数(合数)
埃筛法 通过给素数,合数做上标记
*/
public static int essayMethod(int num) {
boolean[] isPrime = new boolean[num];//false代表素数, 默认所有数都是素数
int count = 0;
for (int i = 2; i < num; i++) {
if (!isPrime[i]) {//第一个数 2 肯定是素数直接通过
count++;
for (int j = 2 * i; j < num; j += i) {//就是合数的标记位 , 可优化为 int j = 2 * i 判断了2、5就不用在判断10
isPrime[j] = true;
}
}
}
return count;
}
}