leetcode刷题之旅 204.计数质数

统计所有小于非负整数n的质数的数量

示例:

输入:10

输出:4

解释:小于10的质数一共有4个,分别是2,3,5,7

 

思路:生成小于数n的所有质数

对数集{1,2,...,n}

初始状态:质数2,3

质数2、3的倍数都不是质数

划掉4,6,8,9,...

从3开始往后数,5是第一个质数,则5的倍数不是质数

划掉10,15,20,...

直到遍历完整个数集

 

1. 存在完整数集N{1,2,...,n},算法要把数集N划分成质数集P和非质数集nP

1. 生成初始质数集P{2},把P中的数从N中删去

2. 对于质数集P中的最后一个数x,把N中属于x的倍数的数都分到非质数集nP

3. 取出N中的第一个数,加到P中,跳到第2步。

在2-3步之间循环直到N为空,则P为所求

(发现这个思路完全没办法直接转换成代码啊)

 

方法1(执行用时 :44 ms, 在所有 C++ 提交中击败了81.73% 的用户

内存消耗 :15.5 MB, 在所有 C++ 提交中击败了46.15%的用户)

class Solution {
    public:
        int countPrimes(int n) {
            int result=0;
            if(n==0||n==1||n==2) result=0;
            else{
                int isPrime[n+1];
                for(int i=2;i<=n;i++){
                    isPrime[i]=1;
                }
                isPrime[0]=0;
                isPrime[1]=0;
                vector<int> prime;
                prime.push_back(2);
                int lastPrime=2;
                result++;
                int seq=0,flg=1,findout=0;
                int temp=0;
                while(flg){
                    int i=1;
                    temp=i*lastPrime;
                    while(temp<=n){ //找出非质数
                        isPrime[temp]=0;
                        i++;
                        temp=i*lastPrime;
                    }
                    findout=0;  //还原findout
                    int tempPrime=lastPrime;
                    while(!findout&&tempPrime<n){    //找到下一个质数或者发现当前质数是最后一个质数
                        tempPrime++;
                        if(isPrime[tempPrime]){
                            prime.push_back(tempPrime);
                            seq++;
                            findout=1;
                        }
                    }
                    if(tempPrime<n){
                        lastPrime=tempPrime;
                        result++;
                    }
                    else flg=0;
                }
                if(result==n) result--;
            }
            return result;
        }
};

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值