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

    常用素数筛

    1.暴力

    bool primes(int x)
    {
        for(int i=2;i<=x/i;++i){
         	if(x%i==0)	return false;   
    	}
        return true;
    }
    

    2.埃拉托斯特尼筛法(埃氏筛法)

    void Primes(int x)  
    {  
        for (int i=0;i<=x;++i) prime[i]=1;    //先把每个数都定义为合数
        prime[0]=prime[1]=0;  
        for (int i=2;i<=x;i++)  
        {  
            if (!prime[i]) continue;  
            for (int j=i+i;j<=x;j+=i) prime[j] = 0;  //将i的倍数标记为合数
        }  
    }
    

    该筛法可以引申为一种思想,绝不仅限于用于筛素数

    3.线性筛法

    该筛法是基于唯一分解定理之上

    铺垫:唯一分解定理:任何大于1的自然素都可以写成有限个质数的乘积

    int vis[maxn],prime[maxn];		//判断是否是质数和储存质数
    inline void primes(int x){
        for(int i=1;i<=x;++i){
            vis[i]=tot=0;
        }
        for(int i=2;i<=x;++i){
            if(vis[i]==0)   prime[++tot]=i;
            for(int j=1;prime[j]<=x/i;++j){
                vis[prime[j]*i]=1;
                if(i%prime[j]==0)   break;  //prime[j]一定是i的最小质因子
            }
        }
        printf("%d
    ",tot);         //质数的个数
    }   
    
  • 相关阅读:
    面试常见问题
    Servlet上传下载
    Java五大框架
    Jquery
    JavaEE
    Html学习
    JavaSE高级
    面向过程基础
    Java开发软件安装及配置
    JAVA的类加载机制和Class类
  • 原文地址:https://www.cnblogs.com/StungYep/p/12252418.html
Copyright © 2011-2022 走看看