解法1:暴力法(BP)
public class leetcode1 {
public static void main(String[] args) {
bp(10000);
}
//使用暴力法,因为0和1规定不是素数也不是,所以从2开始
public static void bp(int n){
int count=0;
for (int i= 2; i <= n; i++) {
count+=isPrime(i)? 1: 0;
}
System.out.println(count);
}
//这里i*i<x的意思,是因为i要小于根号x,因为例如12=3*4 和4*3重复了一次
private static boolean isPrime(int x) {
for (int i = 2; i*i <= x; i++) {
if (x % i ==0){
return false;
}
}
return true;
}
}
解法2:埃筛法
解法1时间复杂度太大了,面试还是得用解法二
思路:使用标记位标记合数(非素数)
什么是埃式筛选:简单来说 就是把素数的倍数筛选出去 比如2式素数 2的倍数都不是素数 2 4 6 8 或者 23=6 24=8 等等
直接去掉 这要就不用重复查找了
参考:https://blog.csdn.net/weixin_52514567/article/details/115917341
public class leetcode4 {
public static void main(String[] args) {
System.out.println(countPrime(100));
}
public static int countPrime(int n){
boolean[] notIsPrime=new boolean[n]; //false表示是素数,创建时默认是false
int count=0;
for (int i = 2; i < n; i++) {
if (!notIsPrime[i]){
count++;
//埃筛法就是这样从一个数开始一直乘,标记是合数的
//j就是合数的标记位
//这里 j+=i 意思是 不断地 j=(j++)*i的意思
//这里j=2*i可以改为j=i*i,因为也是类似上面解法1的,他们有重复统计的
for (int j = 2*i ; j < n; j+=i) {
notIsPrime[j]=true;
}
}
}
return count;
}
}