zoukankan      html  css  js  c++  java
  • leetCode(49):Count Primes 分类: leetCode 2015-07-24 09:58 117人阅读 评论(0) 收藏

    Description:

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

    判断一个数是否是质数主要有以下几种方法:

    1)直接用该数除于所有小于它的数(非0,1),如果均不能被它整除,则其是质数;

    2)除以小于它一半的数,因为大于其一半必定是无法整除,如果均不能被它整除,则其是质数;

    3)除以小于sqrt(a)的数,原因如下:

            除了sqrt(a)之外,其他的两数乘积为a的,一定是比个比sqrt(a)小,一个比sqrt(a)大。所以判断到sqrt(a)就可以了,因为另一半就是刚才做除法的商的那部份。

    4)除以小于sqrt(a)的质数即可;

            因为质数不能被除自身和1外的所有数整除,非质数则不然,且其必然能被某一质数整除。如果一个数能被某一非质数整除,则其必然能被组成这一非质数的最小质数整数。

              从上可以看出,判断一个数是否是质数,其计算量取决于整除的个数,上述四种方法,除数逐渐变少。


    通过以上分析,这是本人自己的程序:

    class Solution {
    public:
        int countPrimes(int n) {
            if (n == 0 || n == 1 || n==2)
        		return 0;
        
        	vector<int> vec;//质数容器
        
        	vec.push_back(2);
        	for (int i = 3; i < n; ++i)
        	{
        		int j = 0;
        		int length=vec.size();
        		for (; j<length && vec[j]*vec[j]<i; ++j)//除数是小于sqrt(i)的所有质数
        		{
        			if (i%vec[j] == 0)
        				break;
        		}
        		if (vec[j]*vec[j]>i)
        			vec.push_back(i);
        	}
        	return vec.size();
        }
    };

    下面是在网上找到一个程序,很详细:

    这道题给定一个非负数n,让我们求小于n的质数的个数,题目中给了充足的提示,解题方法就在第二个提示埃拉托斯特尼筛法Sieve of Eratosthenes中,这个算法的过程如下图所示,我们从2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,一次类推,直到根号n,此时数组中未被标记的数字就是质数。我们需要一个n-1长度的bool型数组来记录每个数字是否被标记,长度为n-1的原因是题目说是小于n的质数个数,并不包括n。 然后我们用两个for循环来实现埃拉托斯特尼筛法,难度并不是很大,代码如下所示:

     

    埃拉托斯特尼筛法

     

    复制代码
    class Solution {
    public:
        int countPrimes(int n) {
            vector<bool> num(n - 1, true);
            num[0] = false;
            int res = 0, limit = sqrt(n);
            for (int i = 2; i <= limit; ++i) {
                if (num[i - 1]) {
                    for (int j = i * i; j < n; j += i) {//为什么要从i*i开始,因为小于i*i的数可能已经被小于i的数整除了,如果没有,那它就是质数
                        num[j - 1] = false;
                    }
                }
            }
            for (int j = 0; j < n - 1; ++j) {
                if (num[j]) ++res;
            }
            return res;
        }
    };
    复制代码


  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687047.html
Copyright © 2011-2022 走看看