思路:
首先先把所有的奇数都假设为素数,偶数都为合数(除2外),剩下的奇数如果是合数的话,那么该奇数一定是某个比它小的奇数的倍数
举例:
求n以内的素数
首先把 1 3 5 7 9 11 13 15 17…假设为素数
然后从3开始一直到n 判断某个数是否为素数,如果为素数就将它依次乘以2,3…所得到的结果(不超过n)置为素数,如果该数不是素数,则不需要进行乘2,3… 因为该数的倍数 会由该数的某个素数因数判断其为合数得来。
**
代码
**
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int prim[1001];
int main()
{
int n;
cin>>n;
memset(prim,0,sizeof(prim));
prim[1]=1;// 1是素数
prim[2]=1;// 2也是素数
for (int i=3;i<=n;i++){
if(i%2) prim[i]=1; //先把所有奇数的看为是素数
}
//奇数如果是合数 那么该奇数的因数应该是某个奇数的倍数
//去去除奇数中的合数
//超过sqrt(n)的数不需要再求的倍数 因为他的倍数为x 且x不超过n的话
//则x的另一个因数会小于sqrt(n)
for (int i=3;i<=sqrt(n);i++){
if(prim[i]){
for (int j=i+i;j<=n;j+=i){
prim[j]=0;
}
}
}
for (int i=1;i<=n;i++){
if(prim[i]) cout<<i<<" ";
}
}