leetcode【数学】-----204. Count Primes(计数质数)

1、题目描述

 

2、分析

        这道题要求求出给定一个n以内的质数的个数,首先最容易想到的方法那肯定是判断每一个数是不是质数,判断质数有一个取巧的地方是,不需要遍历到这个数本身,只需要遍历到这个数的开方就好。如果是则加1。也就是代码中第一种方法。但是还有一种方法是使用埃拉托斯特尼筛法,它的过程是,2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,一次类推,直到根号n,此时数组中未被标记的数字就是质数。这样就需要一个大小为n的数组,数组类型为bool,初始化为未标记,在一次遍历的过程中即进行标记也进行计数。

3、代码

class Solution {
public:
    int countPrimes(int n) {
        int cnt=0;
        bool flag;
        for(int i=2;i<n;++i){
            flag=isprimes(i);
            if(flag) ++cnt;
        }
        return cnt;
    }
    bool isprimes(int n){
        int m=(int)sqrt(n);
        for(int i=2;i<=m;++i){
            if(n%i==0&&n!=i)
                return false;
        }
        return true;
    }
};


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

4、相关知识点 

        掌握最容易想到的,数学类的方法需要多学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值