Count Primes [LeetCode 解题报告]

题目描述:
给定n,返回小于n的素数的个数。
解题思路:
1)地毯式搜索(TLE)
即:统一从2到根号n的所有数中素数的个数,太暴力了,没过测试!
2)上下素性判别法(貌似是这个名字,TLE)
大于3的所有素数都可以表示成6*k+1或者6*k-1的形式,从而只从满足这个条件的数中进行地毯式筛选,无奈还是TLE。。。。
3)迭代向后筛选法(名字自创的,哈哈!!重点是理解思路就行)
首先分析小于n的所有数中,所有偶数肯定不是素数,所以从所有奇数中筛选;在所有奇数中,每个小奇数的奇数倍肯定也不是素数,循环至n的开平方;然后统计所有奇数中没有被标定为和数的个数,即可得到最终的count,代码如下:

int countPrimes(int n) {
        if(n<=2)return 0;
        bool isNotPrime[n+1]={};
        for(int i=3;i<=sqrt(n);i+=2){
            if(isNotPrime[i])continue;
            for(int j=i*i;j<n;j+=2*i)
            isNotPrime[j]=true;
        }
        int res=1;
        for(int i=3;i<n;i+=2)
        if(!isNotPrime[i])res++;
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值