• C++
  • CSP数学之初等数论【质数判定,埃氏筛法,线性筛法】

  • @ 2024-10-13 17:06:56

image

#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;
}

image

image

image

#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;
}

image

0 条评论

目前还没有评论...