204. count-primes/hints

本文介绍了一种优化的质数筛选算法,通过将所有小于给定数的合数标记为0,来快速找出质数。算法的时间复杂度远低于O(N*N),适合于大规模数据的质数查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      这道题还是挺有意思的,找质数,如果按照最笨的方法一个一个遍历,需要的复杂度是O(N*N),但是显然复杂度比较高,所以,需要找到时间复杂度比较低的方案。

       题目大意 :给出一个数,找出所有小于该数的质数,并输出质数的个数是多少。

       首先,我们找到第一个质数2, 然后将2的整数倍且比n小的元素都置为0,这样4,6,8,……都置为0,然后继续寻找第二个质数,找到了3,将3的整数倍且比n小的元素都置为0,依次类推,直到找到根号n时停止,因为,举个例子,16可以由2*8 4*4 8*2组成,而2*8 和8*2是等价的,因此只需要找出另一半就可以了。

       将所有的合数都置为了0,那么从2开始数没有置为的0的数字个数,最终输出的结果就是所有质数的个数。

代码如下:

class Solution {
public:
    int countPrimes(int n) {
        vector<bool> isprime(n, 1);
        for (int i=2; i*i < n; ++i) {
            if (isprime[i]) {
                for (int j=i*i; j<n; j+=i) {
                    isprime[j] = 0;
                }
            }
        }
        int count = 0;
        for (int i=2; i<n; ++i) {
            if (isprime[i]) {
                ++count;
            }
        }
        return count;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值