根据算术基本定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。
用一个bool类型的数组prime[ i ]来标记 i 是否为素数。根据以上定理,如果prime[ i ]判定为素数,则prime[ i*j ]一定不为素数。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll maxn=1e6+10;
bool prime[maxn];//声明一个数组来判断是否为素数
int main(){
ll n;
scanf("%lld",&n);
prime[0]=false;
prime[1]=false;//要提前将这两个位置置为false
for(int i=2;i<=n;i++)
prime[i]=true;//将其他位置置为true
for(int i=2;i<=n;i++){
for(int j=2;i*j<=n;j++){
prime[i*j]=false;
}
}
for(int i=2;i<=n;i++){
if(prime[i])printf("%d\n",i);
}
}