204. Count Primes(easy)

Easy

1203432FavoriteShare

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

Example:

Input: 10

Output: 4

Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.

 

利用已知素数找下一个素数法:

C++:

/*
 * @Author: SourDumplings
 * @Date: 2019-08-17 14:20:07
 * @Link: https://github.com/SourDumplings/
 * @Email: changzheng300@foxmail.com
 * @Description: https://leetcode.com/problems/count-primes/
 * 
 * 注意判断素数,除数的平方大于被除数就没必要再增大除数了
 */

class Solution
{
public:
    int countPrimes(int n)
    {
        if (n == 3)
        {
            return 1;
        }
        else if (n < 3)
        {
            return 0;
        }

        vector<int> primes;
        primes.push_back(2);
        primes.push_back(3);
        while (primes.back() < n)
        {
            get_next_prime(primes);
        }
        return primes.size() - 1;
    }

    void get_next_prime(vector<int> &primes)
    {
        int start = primes.back();
        for (int i = start + 2;; i += 2)
        {
            bool isPrime = true;
            for (auto it = primes.begin() + 1; it != primes.end(); ++it)
            {
                int j = *it;
                if (i % j == 0)
                {
                    isPrime = false;
                    break;
                }
                if (j * j > i)
                {
                    break;
                }
            }
            if (isPrime)
            {
                primes.push_back(i);
                break;
            }
        }
    }
};

埃式筛法获得素数表:

C++:

/*
 * @Author: SourDumplings
 * @Date: 2019-08-17 14:20:07
 * @Link: https://github.com/SourDumplings/
 * @Email: changzheng300@foxmail.com
 * @Description: https://leetcode.com/problems/count-primes/
 * 
 * 利用埃式筛法,将合数都覆盖掉便得到素数表
 */

class Solution
{
public:
    int countPrimes(int n)
    {
        if (n == 3)
        {
            return 1;
        }
        else if (n < 3)
        {
            return 0;
        }

        bool isPrime[n];
        fill(isPrime, isPrime + n, true);
        isPrime[0] = isPrime[1] = false;
        for (int i = 4; i < n; i += 2)
        {
            isPrime[i] = false;
        }

        for (int i = 3; i * i < n; i += 2)
        {
            if (isPrime[i])
            {
                for (int j = 2; j * i < n; ++j)
                {
                    isPrime[i * j] = false;
                }
            }
        }
        return count(isPrime, isPrime + n, true);
    }
};

Java:

 

/*
 * @Author: SourDumplings
 * @Date: 2019-08-17 15:11:38
 * @Link: https://github.com/SourDumplings/
 * @Email: changzheng300@foxmail.com
 * @Description: https://leetcode.com/problems/count-primes/
 */

class Solution
{
    public int countPrimes(int n)
    {
        if (n == 3)
        {
            return 1;
        }
        else if (n < 3)
        {
            return 0;
        }

        boolean[] isPrime = new boolean[n];
        Arrays.fill(isPrime, true);
        isPrime[0] = isPrime[1] = false;
        for (int i = 2; i < n; i += 2)
        {
            isPrime[i] = false;
        }
        int res = 1;
        for (int i = 3; i * i < n; i += 2)
        {
            if (isPrime[i])
            {
                for (int j = i + i; j < n; j += i)
                {
                    isPrime[j] = false;
                }
            }
        }
        for (int i = 2; i < n; i++)
        {
            if (isPrime[i])
            {
                ++res;
            }
        }
        return res;
    }
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值