• 素数问题


    1、试除法判断素数

    时间复杂度:O(√n)

    bool is_prime(int n)
    {
        if(n<=1) return false;
        for(int i=2;i*i<=n;++i){//比i<=sqrt(n)好,小心i*i溢出
           if(n%i==0) return false;
        }
        return true;
    }
    

    2、埃氏筛(Eratosthenes)

    时间复杂度:O(nloglogn)

    void getPrime(int n)
    {
        memset(vis,true,sizeof(vis));
        vis[0]=vis[1]=false;
        for(int i=2;i*i<=n;++i){//小心i*i溢出
           if(vis[i]){
             for(int j=i*i;j<=n;j+=i)//for(int j=i;j*i<=n;++j)
                vis[j]=false;//           vis[i*j]=false;
           }
        }
    }
    

    3、线性筛/欧拉筛(Euler)

    时间复杂度:O(n)

    void getPrime()
    {
        //memset(vis,false,sizeof(vis));
        //memset(primes,0,sizeof(primes));
        int cnt=0;
        for(int i=2;i<=n;++i){
           if(!vis[i]) primes[++cnt]=i;//i是素数
           for(int j=1;j<=cnt&&primes[j]<=n/i;++j){
              vis[primes[j]*i]=true;//true:非素数
              if(i%primes[j]==0) break;
           }
        }
    }
    

    4、素数拆分(质因数分解)

    Function 1:

    时间复杂度:O(√n)

    void Fac(int n)
    {
        int m=0;
        for(int i=2;i<=sqrt(n);++i){
           if(n%i==0){
             p[++m]=i,c[m]=0;
             while(n%i==0) n/=i,c[m]++;
           }
        }
        if(n>1) p[++m]=n,c[m]=1;
    }
    

    Function 2:

    时间复杂度:O(√s)
    s为√n内质数个数.

    struct factor{
        int prime,cnt;
        factor(int p,int c):prime(p),cnt(c){}
    };
    
    void Fac(int n,vector <factor>&ans){
        ans.clear();
        if(n==1) return;
        for(int i=1;i<=m;++i){//m:素数个数
           if(n%primes[i]==0){
             factor f(primes[i],0);
             while(n%primes[i]==0) n/=primes[i],f.cnt++;
             ans.push_back(f);
           }
           if(n==1) return;
        }
        ans.push_back(factor(n,1));
    }
    
  • 相关阅读:
    破解网站防盗链的方法
    Mysql用户设置密码和权限
    学者批教育不公阻碍穷二代向上流动 致贫者愈贫
    未来IT行业将缩减到三类职业
    RHEL6参考文档(官方的PDF文件)
    分析:低成本应用先锋 Linux系统大盘点
    提高网站排名的5大因素
    七部门查处奥数班遇尴尬 学生齐喊“出去”
    Linux步入弱冠之年
    职位 工作
  • 原文地址:https://www.cnblogs.com/unravel-CAT/p/15340504.html
Copyright © 2020-2023  润新知