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

    【原始】

    时间复杂度O(n*sqrt(n))

    bool isprime(int n)
    {
    	for(int i=2;i<=sqrt(n);i++)
    	{
    		i	return false;
    	}
    	return true;
    }

    【普通筛——埃拉托斯特尼(Eratosthenes)筛法】

    时间复杂度O(nloglogn)

    int prime[MAX_N];
    bool isprime[MAX_N];
    int solve(int n)
    {
    	int cnt=0;
    	for(int i=0;i<=n;i++)
    		isprime[i]=true;
    	isprime[0]=isprime[1]=false;
    	for(int i=2;i<=n;i++)
    	{
    		if(isprime[i])
    		{
    			prime[p++]=i;
    			for(int j=2*i;j<=n;j+=i)
    				isprime[j]=false;
    		}
    	}
    	return cnt;
    }

    【线性筛——欧拉Euler筛】

    时间复杂度为O(n)

    #define MAXN 1000000 
    int prime[MAXN],v[MAXN]; 
    //a[i] i 为质数则为0,否则为 1 
    //prime[j] 表示第 j 个质数
    int m=0;//m表示现在筛出m个质数 
    void primes() 
    {    
    	for(int i=2;i<MAXN;i++)    
    	{        
    		if(v[i]==0)//如果v[i]为0,说明 i 之前没有被筛到过,i 为质数             
    			prime[++m] = i;        
    		for(int j = 1;j<=m;j++)//遍历小于 i 的所有质数        
    		{             
    			int t = prime[j]; 
    			//乘起来大于MAXN就跳出循环            
    			if(t*i > MAXN) 
    				break;            
    			v[i*t] = 1;//标记 i*prime[j] 的最小质因数是prime[j]             
    			//当遇到最小的质数是i的因数时,break             
    			if(i%t==0)
    				break;        
    		}    
    	} 
    }
  • 相关阅读:
    array_merge
    漏斗模型
    3 破解密码,xshell连接
    2-安装linux7
    1-Linux运维人员要求
    17-[模块]-time&datetime
    16-[模块]-导入方式
    Nginx服务器
    15-作业:员工信息表查询
    14-本章总结
  • 原文地址:https://www.cnblogs.com/yyaoling/p/12260436.html
Copyright © 2011-2022 走看看