LeetCode 204. 计数质数

 题目描述:

解法一(厄拉多塞筛法):

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

解法二(优化内存的厄拉多塞筛法):

class Solution {
public:
    int countPrimes(int n) {
        vector<int> dp(n/32+1,0);            //一共需要n个二进制位来存储状态
        int res=0;
        for(int i=2;i<n;i++){
            if((dp[i/32]&(1<<(i%32)))==0){        //第i个二进制位为0
                res++;
                for(int j=i;j<n;j+=i){
                    dp[j/32]|=1<<(j%32);         //将i的倍数位置1
                }
            }
        }
        return res;
    }
};

 

posted @ 2019-08-30 22:29  DH_HUSTer  阅读(9)  评论(0编辑  收藏  举报