素数的定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。
1.暴力算法:
令i=2; 当i<n的时候,我们循环找出2-i的质数,即让i%(2~i-1),如果flag为true,则i为质数,计数器++;否则跳出,i++;进行下一次判断
public int countPrimes(int n) {
int i=2;
int count=0;
boolean flag=true;
while (i<n){
for (int j = 2; j <i ; j++) {
if(i%j==0){
flag=false;
break;
}
}
if(flag) {
count++;
}
flag=true;
i++;
}
return count;
}
2.采用埃拉托斯特尼筛法,先创建一个长度为n的boolean数组,默认值都为false;我们直接从2开始判断,之后用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。每次都筛选出 i*j<n的数,置为ture,这样可以减少很多不必要的运算
时间复杂度:O(n*lglgn)
public static int countPrimes(int n) { boolean []nums=new boolean[n]; int count=0; for (int i = 2; i <n ; i++) { if(nums[i]==false){ count++; for (int j = 2; i*j <n ; j++) { nums[i*j]=true; } } } return count; }