Count Primes LeetCode

这是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;

}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值