统计所有小于非负整数n的质数的数量
示例:
输入:10
输出:4
解释:小于10的质数一共有4个,分别是2,3,5,7
思路:生成小于数n的所有质数
对数集{1,2,...,n}
初始状态:质数2,3
质数2、3的倍数都不是质数
划掉4,6,8,9,...
从3开始往后数,5是第一个质数,则5的倍数不是质数
划掉10,15,20,...
直到遍历完整个数集
1. 存在完整数集N{1,2,...,n},算法要把数集N划分成质数集P和非质数集nP
1. 生成初始质数集P{2},把P中的数从N中删去
2. 对于质数集P中的最后一个数x,把N中属于x的倍数的数都分到非质数集nP
3. 取出N中的第一个数,加到P中,跳到第2步。
在2-3步之间循环直到N为空,则P为所求
(发现这个思路完全没办法直接转换成代码啊)
方法1(执行用时 :44 ms, 在所有 C++ 提交中击败了81.73% 的用户
内存消耗 :15.5 MB, 在所有 C++ 提交中击败了46.15%的用户)
class Solution {
public:
int countPrimes(int n) {
int result=0;
if(n==0||n==1||n==2) result=0;
else{
int isPrime[n+1];
for(int i=2;i<=n;i++){
isPrime[i]=1;
}
isPrime[0]=0;
isPrime[1]=0;
vector<int> prime;
prime.push_back(2);
int lastPrime=2;
result++;
int seq=0,flg=1,findout=0;
int temp=0;
while(flg){
int i=1;
temp=i*lastPrime;
while(temp<=n){ //找出非质数
isPrime[temp]=0;
i++;
temp=i*lastPrime;
}
findout=0; //还原findout
int tempPrime=lastPrime;
while(!findout&&tempPrime<n){ //找到下一个质数或者发现当前质数是最后一个质数
tempPrime++;
if(isPrime[tempPrime]){
prime.push_back(tempPrime);
seq++;
findout=1;
}
}
if(tempPrime<n){
lastPrime=tempPrime;
result++;
}
else flg=0;
}
if(result==n) result--;
}
return result;
}
};