zoukankan      html  css  js  c++  java
  • 8.11 素数

    素数,又叫质数,定义是除了1和它本身以外没有别的因数

    判断一个数是不是素数  复杂度O(根号N)

    bool prime(int x)
    {
        if(x<=1)return false;
        for(LL i=2;i*i<=x;i++)if(x%i==0)return false;
        return true;
    }

    求出1~N内所有的素数

    埃式筛法(埃拉托斯特尼筛法)

    原理:如果找到一个质数,那么这个质数的倍数都不是质数

    优点:好写,稳

    复杂度:O(nloglogn)

    #define LL long long
    const int maxn=1e6+10;
    bool isprime[maxn];
    int prime[30000];
    int cnt=0;
    void init()
    {
        LL i,j;
        for(i=2;i<=maxn;i++)
        {
            if(!isprime[i])
            {
                prime[cnt++]=i;
                for(j=i*i;j<=maxn;j+=i)//从i*i开始,减小被重复筛的次数
                {
                    isprime[j]=true;
                }
            }
        }
    }

    但是,我们可以看出,有些合数仍然会被筛几遍,例如12,会被2筛去,又被3筛去,这样就浪费了时间

    于是,我们引出

    线性筛法(欧拉筛法)

    复杂度:O(N)

    原理:保证每一个合数都被它的最小质因子筛去

     
    bool isprime[maxn];
    int prime[maxn];
    int cnt=0;
    void init()
    {
       int i,j;
       for(i=2;i<=maxn;i++)
       {
           if(!isprime[i])prime[cnt++]=i;//把质数存起来
           for(j=0;j<cnt&&i*prime[j]<=maxn;j++)
           {
               isprime[i*prime[j]]=true;
               if(i%prime[j]==0)break;//保证每一个合数被它最小的质因数筛去
           }
       }
    }
  • 相关阅读:
    Oracle数据库不能使用索引的原因定位
    C语言中的strncmp
    C标准库函数
    C语言字符串函数大全
    Postgres性能检测
    test cert by python
    如何在C语言中巧用正则表达式
    北大软微一年ABCD
    C 语言字符数组的定义与初始化
    25个设计设计灵感的紫色网站案例
  • 原文地址:https://www.cnblogs.com/raincle/p/9459874.html
Copyright © 2011-2022 走看看