素数——欧拉筛~2020.9.4

tech2025-05-28  2

代码如下:

#include <iostream> #include <cstring> using namespace std; const int maxn = 65535; int num[maxn] = {0}; bool prime[maxn]; void isPrime(int n){ memset(prime,true,sizeof(prime)); int cnt = 0; for(int i=2;i<=n;i++){ if(prime[i]){ num[cnt++] = i; } for(int j=2;j*i<=n;j++){ prime[j*i] = false; if(i%j == 0){ break; } } } for(int i=0;i<cnt;i++){ cout<<num[i]<<' '; } } int main() { int n; cin>>n; isPrime(n); return 0; }

用户输入一个数字,该程序将反馈出小于这个数字的所有素数。 欧拉筛法核心部分:

void isPrime(int n){ memset(prime,true,sizeof(prime));//初始化bool数组 int cnt = 0; //用于当作num数组下标的cnt变量 for(int i=2;i<=n;i++){ //0和1不是素数,所以直接从2开始找 if(prime[i]){ //如果是素数,存储在num中,方便输出 num[cnt++] = i; } for(int j=2;j*i<=n;j++){ //欧拉筛思想的核心 prime[j*i] = false; //素数的倍数一定不是素数,将prime中素数的倍数设置为false if(i%j == 0){ /*欧拉筛与埃氏筛的区别:仅需做一次倍数处理,无需多次 (意思是之后的倍数通过之后的素数筛去,当前素数无需多次筛去倍数)*/ break; } } } for(int i=0;i<cnt;i++){ cout<<num[i]<<' '; } }

程序运行结果:

最新回复(0)