【leetcode】Count Primes(easy)

Count the number of prime numbers less than a non-negative number, n

 

思路:数质数的个数

开始写了个蛮力的,存储已有质数,判断新数字是否可以整除已有质数。然后妥妥的超时了(⊙v⊙)。

看提示,发现有个Eratosthenes算法找质数的,说白了就是给所有的数字一个标记,把质数的整数倍标为false,那么下一个没被标为false的数字就是下一个质数。

int countPrimes(int n) {

        if(n <= 2) return 0;

        bool * mark = new bool[n];

        fill_n(mark, n, true);



        int primesNum = 1;

        int curpos = 2;

        while(curpos < n)

        {

            //把当前质数的倍数标记为不是质数

            for(int i = 2 * curpos; i < n; i += curpos)

            {

                mark[i] = false;

            }



            //找下一个质数

            int i;

            for(i = curpos + 1; i < n && !mark[i]; ++i);

            if(i == n)

            {

                delete [] mark;

                return primesNum; //没有多余的质数 返回答案

            }

            else

            {

                curpos = i;

                primesNum++;

            }

        }

    }

 

别人写的C版本的:

int countPrimes(int n) {

    bool *pb = calloc(n-1,sizeof(bool));



    int ret_c=0;

    // idx 0 represent 2

    int idx=0;

    int pend=n-2;

    while(idx<pend){

        if(0==pb[idx]){

            ++ret_c;

            int op=idx;

            while(op<pend){

                pb[op]=1;

                op+=(idx+2);

            }

        } 

        ++idx;

    }

    free(pb);

    return ret_c;

}

 

你可能感兴趣的:(LeetCode)