素数筛法模板 欧拉筛法

来源:互联网 发布:上海行知中学初中部 编辑:程序博客网 时间:2024/06/06 01:25




  素数的分析详细(高效)  素数筛法:https://yq.aliyun.com/articles/175086



简单素数    http://www.cnblogs.com/luluping/archive/2010/03/03/1677552.html


简单的素数筛法:   


int i,j,k;for(i=2;i<=n;i++)   u[i]=true;  //初始时所有数都在筛中for(i=2;i<=n;i++)   //顺序搜索筛中的最小数if(u[i])for(j=2;j*i<=n;j++) u[j*i]=false; //将i的倍数从筛中筛去    for(i=2;i<=n;i++)   if(u[i]) su[++num]=i; //将筛去的素数放入数组中

o(n*long log(n))    算法中合数是作为素数的倍数筛去的,显然,如果每个合数仅被它最小的质因数筛去,则算法效率可以大幅度的提升,由此引出一种优化过的算法-----欧拉算法  !!!!  时间复杂度不到o(n) 哟!!!


欧拉算法:

    int i,j,num=1;    memset(u,true,sizeof(u));    for(i=2;i<=n;i++){   //遍历整个区间的每一个数    if(u[i]) su[sum++]=i;  //将筛中的最小数送入素数表    for(j=1;j<num;j++)  //搜索素数表中的每个数    {    if(i*su[j]>n) break;  //i与当前的素数之积超出范围 分析下一个素数    u[i*su[i]]=false;     //将i与当前素数的乘积从筛子中筛去    if(i%su[j]==0) break; //当前素数为i的最小素因子,则分析下一个整数    }    }








原创粉丝点击