zoukankan      html  css  js  c++  java
  • (算法)求1到1亿间的质数或素数

    题目:

    求1到1亿间的质数或素数

    思路:

    什么是质数?

    质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。(来自百度百科)

    方法1:

    遍历1到1亿间的所有数,然后逐个判断是否为质数;

    如何判断一个数为质数?根据质数的定义,判断该数是否能被1和它本身之外的数整除,如果是,则不是质数,否则为质数;一般只需判断是否能被2到sqrt(num)的所有数整数。

    方法2:

    上述方法时间复杂度较高,对于1亿个数而言,不太实际。

    其实当我们遍历到某个数(如:n)的时候,所有n的倍数的数字均不为质数,后续我们无需对这个数再做判断的操作,这样可以减少很多不必要的计算;

    而且,我们可以从逆向思维来考虑,出了各个n的倍数的数字之外,其他的就是质数,于是少了判断是否为质数的过程。

    现在需要做的就是将这些提前判断为非质数的数字保存起来,可以通过一个bool数组,如果某个数字为非质数,则在对应下标的数组位置做标志,以供后续判断。

    时间复杂度:O(n),空间复杂度:O(n)

    注意:

    这里处理的是一亿个数字,因此需考虑机器的内存问题,32位机器的int表示范围为0~2^32-1即4394967295,能表示一亿,一亿个int需要的内存为400M。

    (下面的代码建立在内存足够的情况下)

    代码:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    const unsigned int MAX_NUM=100;
    
    void Prime(vector<bool> &numbers,vector<int> &primes){
        for(unsigned int i=2;i<=MAX_NUM;i++){
            if(numbers[i]==false){
                primes.push_back(i);
                // multiple of i
                for(unsigned int j=i;j<=MAX_NUM;j+=i)
                    numbers[j]=true;
            }
        }
    }
    
    
    int main()
    {
        vector<bool> numbers(MAX_NUM,false);
        vector<int> primes;
    
        Prime(numbers,primes);
    
        vector<int>::iterator it=primes.begin();
        for(;it!=primes.end();it++){
            cout<<*it<<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    BZOJ2330 SCOI2011糖果
    BZOJ 3812主旋律
    模板更新 扩展卢卡斯
    BZOJ4556 HEOI2016字符串
    CodeForces700E Cool Slogans
    Atcoder Contest069F:Flag
    计算几何模板(更新中......)
    BZOJ4003 JLOI2015城池攻占
    BZOJ3772精神污染
    HDU5919 SequenceⅡ
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4695469.html
Copyright © 2011-2022 走看看