看我两种筛法:
#include<iostream>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
int n,m,primes[110],isprime[110],cnt=0;
int shaifa_1(){
int i,j;
for(i=2;i<=n;i++){
if(!isprime[i])
primes[cnt++]=i;
for(j=i*i;j<=n;j+=i) //如果i是1000000时,j可能超过int范围,看题目数据范围,小心 j 溢出 ,我就遇到过这个坑
isprime[j]=-1;
}
for(i=0;i<cnt;i++)
cout<<primes[i]<<" ";
cout<<endl;
}
int shaifa_2(){
int i,j;
m=sqrt(n)+1;//区别 1
for(i=2;i<=m;i++){ //区别 2 : i<=m
if(!isprime[i])
primes[cnt++]=i;
for(j=i*i;j<=n;j+=i)
isprime[j]=-1;
}
for(i=m+1;i<=n;i++){ //多了这一块
if(!isprime[i])
primes[cnt++]=i;
}
for(i=0;i<cnt;i++)
cout<<primes[i]<<" ";
cout<<endl;
}
int main(){
memset(isprime,0,sizeof(isprime));
cin>>n;
// shaifa_1();
shaifa_2(); //两种结果一样,第二种速度快一点 ,推荐 shaifa_2
return 0;
}