• 筛法求素数


          在程序设计比赛中我们会经常遇到求素数的问题,最基本的我们是从素数的定义出发只能被1和它本身整除的数才是素数,但是这种方法只适合于单一数判断是否是素数,一旦给你一个非常庞大的范围,求之中的素数,一个个的遍历会耗费很长的时间,这时候我们可以优化求素数的方法,于是诞生了筛法求素数。

          筛法的理论依据,任何一个数都能拆成多个素数的乘积(唯一分解定理),其思想是筛掉范围内所有的合数,而合数由素数乘积的到,素数的倍数就是合数,那么出现一个素数,我们就筛掉它的倍数。

    代码演示:

     1 long long k,i,s[MAX],isprime[MAX];
     2 void prime()
     3 {
     4     k=1;
     5     memset(isprime,1,sizeof(isprime));///初始化都认为是素数
     6     isprime[0]=0;
     7     isprime[1]=0;///0和1不是素数
     8     for(i=2;i<=MAX;i++)
     9     {
    10         if(isprime[i])
    11         {
    12             s[k++]=i;///保存素数
    13         }
    14         for(j=i*2;j<=MAX;j+=i)
    15         {
    16             isprime[j]=0;///素数的倍数都不是素数
    17         }
    18     }
    19 }

    这种筛选方法叫做埃氏筛法,虽然大大缩短了查找素数的时间,但还是存在着许多重复运算,列如我们找6时,2*3=6,在素数2的时候我们经历了一次筛选,在素数3的时候又经历了一次,这就需要接着优化筛法,于是诞生了欧拉筛法。

     

    代码演示:

     1 long long k,i,s[MAX],isprime[MAX];
     2 void prime()
     3 {
     4     k=1;
     5     memset(isprime,1,sizeof(isprime));///初始化都认为是素数
     6     isprime[0]=0;
     7     isprime[1]=0;///0和1不是素数
     8     for(i=2;i<=MAX;i++)
     9     {
    10         if(isprime[i])
    11         {
    12             s[k++]=i;///保存素数
    13         }
    14         for(j=1;j<k&&s[j]*i<MAX;j++)
    15         {
    16             isprime[s[j]*i]=0;///把i之前的所有素数p[j]的i倍筛掉
    17         }
    18     }
    19 }
  • 相关阅读:
    关于自己主动化部署
    浅析概率中的频率学派观点和贝叶斯学派观点
    使用javascript实现浏览器全屏
    扩展BootstrapTable的treegrid功能
    jQuery Validate验证框架详解
    将数据库返回的ResultSett转换成List装Map形式的方法(ResultSetToList)
    在maven项目结构下对于Resources目录下文件的存取
    原生sql的各种问题
    nutz 自定义sql的使用
    (转)微服务架构 互联网保险O2O平台微服务架构设计
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/8747331.html
Copyright © 2020-2023  润新知