这是Leetcode里一道类型为简单的算法题
题目描述 Description: Count the number of prime numbers less than a non-negative numberleetcode
最开始在解决这道题的时候,没有什么思路,就随便想了个用数组来存放已经得到的素数,然后循环除以数组里已经得到的从小到大排列的素数,这个方法不知道是自己没写对还是本身有问题,老是会提示各种错误,后来就用了另外一个算法厄拉多塞筛法 其主要思路就是(1)将n个数按顺序依次放在一个表格中,然后将2的倍数删掉,(2)找第一个没被划掉的数就是素数,然后将此素数的倍数全部划掉,继续(2)步骤,剩下的就全部是素数了,需要注意的是在循环某个值i*i>n时就可以停止了,下面附上全部代码:
class Solution{
public:
int countPrimes(int n){
//定义一个可以存放n个数的数组
bool *sushu = new bool[n];
sushu[2]=true;
for(int i=3;i<n;i++){
if(i%2==0)
sushu[i]=false;
}
//找第一个没有被划掉的数即素数,并划掉它的倍数
for(int i=3;i<n;i+=2)
{
if(sushu[i])
{
if(i*i>n) break; //如果i*i>n则后面都可以不判断,值为true的为素数,反之为非素数
for(int j=2;i*j<n;j++)
sushu[i*j]=false;
}
}
int count=0;
for(int i=2;i<n;i++)
{
if(sushu[i])
count++;
}
//释放内存空间
delete [] sushu;
return count;
}
};