- C++
CSP数学之初等数论【质数判定,埃氏筛法,线性筛法】
- 2024-10-13 17:06:56 @
#include<iostream>
#include<cmath>
using namespace std;
# define M 10001 //打出 10000 以内的素数表
int n,s,x;
bool zsb[M];
int main() {
for (int i=2;i<M;i++) zsb[i]=1; //先假定 2 至 10000 都是素数
for (int i=2;i<=sqrt(M-1);i++)
if (zsb[i]==1) { //若 i 为素数,把它的倍数都标记为合数
s=i*2;
while (s<M) zsb[s]=0,s=s+i;
}
for (int i=2;i<M;i++) //输出素数表
if (zsb[i]==1) cout<<i<<' ';
// cin>>n; //接下来的 n 个测试数可直接通过素数表快速做出判断
// for (int i=1;i<=n;i++) {
// cin>>x;
// if (zsb[x]==1) cout<<'Y'<<endl;
// else cout<<'N'<<endl;
// }
return 0;
}
#include<iostream>
using namespace std;
# define M 10001 //打出 10000 以内的素数表
int cnt,prime[1300]; //prime 用于存储素数,10000以内的素数有1229个
bool zsb[M];
int main() {
for (int i=2;i<M;i++) zsb[i]=1; //先假定 2 至 10000 都是素数
for (int i=2;i<M;i++) {
if (zsb[i]==1) prime[cnt++]=i; //若 i 为素数,存入prime数组
for (int j=0;j<cnt;j++) {
if (i*prime[j]>=M) break;
zsb[i*prime[j]]=0; //将 i 的prime[j]倍标记为合数
if (i%prime[j]==0) break; //若prime[j]为 i 的因子,则完成了最小表示法,不用再找其它的表示方法了
}
}
for (int i=0;i<cnt;i++) //输出素数
cout<<prime[i]<<' ';
return 0;
}
0 条评论
目前还没有评论...