博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性筛素数
阅读量:5041 次
发布时间:2019-06-12

本文共 1682 字,大约阅读时间需要 5 分钟。

  1. Eratothenes筛法(埃及老头筛法)O(N log log N)
    埃及老头筛法的原理就是找素数,筛掉在N以内它所有的倍数
#include
using namespace std;const int maxn=1e7;bool prime[maxn];int n,m;void Eratothenes(int n){ memset (prime,0,sizeof(prime)); prime[1]=1;//1非素非合 for(int i=2;i<=n;i++){ if(prime[i])continue;//若是合数,不筛(筛过了) for(int j=i;j<=n/i;j++){ prime[i*j]=1; } //筛素数倍数 }}int main(){ scanf("%d%d",&n,&m); Eratothenes(n); for(int i=1;i<=m;i++){ int ask; scanf("%d",&ask); if(!prime[ask]) printf("Yes\n"); else printf("No\n"); } return 0;}
  1. 欧拉线性筛 O(N)
/*    Name:Euler linear sieve method    Author: Jack    Date: 03/04/19 16:15    Description:       1.依次考虑2~N之间的每一个数i      2.若v[i]=i,说明i为素数,保存在prime[]里      3.扫描不大于v[i]的每个素数p,令v[i*p]=p。        explain:          Because v[i]>p          so the least prime factor(因数) of i*p = p;  */#include
using namespace std;const int maxn=1e7;int prime[maxn],v[maxn];//v[i]为 [i]的最小质因子 bool bucket[maxn];int n,m;void Eratothenes(int n){ int cnt=0;//素数数量 memset (prime,0,sizeof(prime)); memset (v,0,sizeof(v)); for(int i=2;i<=n;i++){ if(v[i]==0){ v[i]=i; prime[++cnt]=i; bucket[i]=1; } for(int j=1;j<=m;j++){ if(prime[j]>v[i]||prime[j]>n/i)break; v[i*prime[j]]=prime[j]; } } }int main(){ scanf("%d%d",&n,&m); Eratothenes(n); for(int i=1;i<=m;i++){ int ask; scanf("%d",&ask); if(bucket[ask]) printf("Yes\n"); else printf("No\n"); } return 0;}

转载于:https://www.cnblogs.com/yangxuejian/p/10759339.html

你可能感兴趣的文章
java的基本数据类型
查看>>
机器学些技法(9)--Decision Tree
查看>>
静态页面复习--用semantic UI写一个10min首页
查看>>
在Windows下安装64位压缩包版mysql 5.7.11版本的方法
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
利用mysqldump备份mysql
查看>>
Qt中子窗口全屏显示与退出全屏
查看>>
使用brew安装软件
查看>>
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>
吴裕雄 python 机器学习——数据预处理嵌入式特征选择
查看>>
Centos6.4安装JDK
查看>>
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
用swing做一个简单的正则验证工具
查看>>
百度坐标(BD-09)、国测局坐标(火星坐标,GCJ-02)和WGS-84坐标互转
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
爬虫综合大作业
查看>>