1、题目描述
2、分析
这道题要求求出给定一个n以内的质数的个数,首先最容易想到的方法那肯定是判断每一个数是不是质数,判断质数有一个取巧的地方是,不需要遍历到这个数本身,只需要遍历到这个数的开方就好。如果是则加1。也就是代码中第一种方法。但是还有一种方法是使用埃拉托斯特尼筛法,它的过程是,2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,一次类推,直到根号n,此时数组中未被标记的数字就是质数。这样就需要一个大小为n的数组,数组类型为bool,初始化为未标记,在一次遍历的过程中即进行标记也进行计数。
3、代码
class Solution {
public:
int countPrimes(int n) {
int cnt=0;
bool flag;
for(int i=2;i<n;++i){
flag=isprimes(i);
if(flag) ++cnt;
}
return cnt;
}
bool isprimes(int n){
int m=(int)sqrt(n);
for(int i=2;i<=m;++i){
if(n%i==0&&n!=i)
return false;
}
return true;
}
};
class Solution {
public:
int countPrimes(int n) {
int res=0;
vector<bool> vis(n,true);
for(int i=2;i<n;++i){
if(vis[i]){
++res;
for(int j=2;i*j<n;++j){
vis[i*j]=false;
}
}
}
return res;
}
};
4、相关知识点
掌握最容易想到的,数学类的方法需要多学习。