【模板】筛素数
来源:互联网 发布:接入网络方式 编辑:程序博客网 时间:2024/06/13 05:06
筛素数也算是一个必会的知识了 方法有很多
要求:给定一个范围N,你需要处理M个某数字是否为质数的询问
介绍两个方法 都很简单
方法一:朴素算法
首先明确一个道理 一个数如果有因数 那么它肯定有<=它平方根的因数
代码如下
#include<iostream>#include<cmath>using namespace std;#define size 1000001int num[size];int n,m;int Squareroot_;int work(int number_){ Squareroot_=sqrt(number_); //求出来这个数的平方根 if(number_==1){ //1的话特殊判断 cout<<"No"<<endl; return 0; } for(int i=2;i<=Squareroot_;i++){ //从2开始枚举<=该数平方根的数 if(number_%i==0){ //只要能整除就不是素数 cout<<"No"<<endl; return 0; } } cout<<"Yes"<<endl; return 0;}int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ cin>>num[i]; work(num[i]); } }//COYG
方法二:埃氏算法
这个方法我比较喜欢 因为很好理解
现将所有2~n的数都写下来 然后将所有2的倍数划去 再将所有3的倍数划去…
这样划完了所有倍数 剩下没划走的 就是素数了
最后进行访问 就能做出判断
代码如下
#include<iostream>using namespace std;#define size 10000001int Instance_[size];int n,m;bool num[size]; //都还没划void sift_(){ num[0]=num[1]=true; //特判 for(int i=2;i<n;i++){ if(!num[i]) for(int j=2*i;j<=n;j+=i){ num[j]=true; } }}void work(){ cin>>n>>m; sift_(); //开划 for(int i=1;i<=m;i++){ //访问 cin>>Instance_[i]; if(num[Instance_[i]]){ cout<<"No"<<endl; } else cout<<"Yes"<<endl; }} int main(){ work(); }//COYG
不用把每个数的倍数都划一遍 光划目前还没有被划走的就行
继续努力!
0 0
- 素数筛【模板】
- 线性筛素数模板
- 模板:筛素数法
- 素数筛法模板
- 素数筛【模板】
- 素数筛模板
- 筛素数法--模板
- 素数筛模板
- 区间素数筛模板
- 线性素数筛模板
- 【模板】筛素数
- 【模板】线性筛素数
- [模板]线性筛素数
- 筛素数-欧拉筛法模板
- 素数筛【模板】
- 快速素数筛模板
- 【模板】线性筛素数
- 筛素数模板
- 笔记9-JAVA的初学浅识(Java的循环结构)
- logstash 清洗cdn日志的开发文件 配置
- 一周搞定MPU6050Linux驱动(3)
- css实现div旋转任意角度
- js中的继承
- 【模板】筛素数
- 万能地图下载器在地质能源应用
- nRF52832 — 修改设备ID和mac地址
- 未来二十年,年轻人将失去奋斗的动力
- AndroidStudio 依赖 ButterKnife 出现的空指针异常 8.0版本以上
- java之递归
- pandas基础运算
- 单链表运算
- web前端面试题