- C++
埃筛研究
- 2024-7-18 15:17:34 @
求小于n的所有素数
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int vis[N];
int n;
void primes(int n){
memset(vis,0,sizeof(vis));
vis[1] = 1;
for(int i=2;i<=n;i++){
if(vis[i]==0){
cout<<i<<endl;
for(int j=i;j<=n/i;j++){
vis[i*j]=1;
}
}
}
}
int main(){
cin>>n;
primes(n);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int v[N],p[N],n,m;
// v数组下标为所有自然数,值为该自然数的最小素因子
// p数组下标为第几个素数,值为素数的值
void primes(int n){//线性筛函数
memset(v,0,sizeof(v));//把v数组所有值初始化为0,默认所有数暂时都是素数
for(int i=2;i<=n;i++){// 循环n-1次,把2~n的所有事拿出来筛选
if(v[i]==0){// v[i]==0代表i是素数,否则是则是合数
v[i] = i;//素数的最小素因子是自己
cout<<"素数"<<i<<endl;
cout<<"标记"<<i<<":"<<v[i]<<endl;
p[++m]=i;
}
cout<<"开始标记"<<i<<"的倍数"<<endl;
for(int j=1;j<=m;j++){//循环m次,把已经记录的素数都遍历出来和i相乘,作为一个新数的素因子
if(p[j]>v[i]||p[i]>n/i){
break;
}
v[i*p[j]]=p[j];
cout<<"标记"<<i*p[j]<<":"<<p[j]<<endl;
}
}
for(int i=1;i<=m;i++){
cout<<"!"<<p[i]<<endl;
}
}
int main(){
cin>>n;//求0~n,有多少个素数
primes(n);//调用线性筛函数
return 0;
}
前100个素数
0 条评论
目前还没有评论...