质数:大于1的正整数,除了能被1或者其本身整除之外不能被其他数整除也叫素数,注意1不是正数
合数:大于1的正整数,可以被除了1和其本身整除
关于质数的几个常用性质:
1、假如x是质数,那么2x,3x,……都是合数
2、任何一个合数都可以分解为几个质数的积,且这种分解是唯一的
如何判断质数:
如果一个数不是质数那么一定满足x*y = num,其中x>1,y<num,x<y;因此1<x<=,所以遍历(1,
]的所有的数,如果都能被num整除说明num是质数,反之不是
相关算法:
厄拉多塞筛法(埃氏筛):如果x是质数那么2x,3x,……都是质数,具体做法遇到x是质数的时候就将2x,3x,4x......都标记为合数
优化:我们可以从x*x开始标记,因为2x,3x....(x-1)*x都被前面的数标记了(例如k*x,2<=k<x,k一定可以分为几个质数的乘积,因此k*x = p1*p2……*pk*x)
实现代码:
public int countPrimes(int n) {
boolean[] visite = new boolean[n]; //标记质数
Arrays.fill(visite, true);
int ans = 0; //质数的数量
for (int i = 2; i < n; i++) { //从2开始
if (visite[i]) {
ans++;
if ((long) i * i < n) { //防止数字大小越界
for (int m = i * i; m < n; m += i) {
visite[m] = false;
}
}
}
}
return ans;
}
相关题型:leetcode 204. 计数质数