以前我们求质数,都是按照“如果一个数n是合数,那么它的因子不超过sqrt(n)”来直接进行计算质数的。
这一题叫做筛选法找质数,那么筛选法是什么方法呢?
筛选法就是将合数筛选出去,这样的话剩下的就是质数了,相当于是一种间接求法。
#include<iostream>
#include <climits>
#include<cmath>
#include <vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<bool> a(n+1,true); //true表示是质数
for(int i=2;i<=floor(sqrt(n));i++)
{
if(a[i])
{
for(int j=2;j<=n/i;j++)
{
a[i*j]=false; //筛选掉合数 即一个质数的倍数都是合数
}
}
}
for(int i=2;i<=n;i++)
if(a[i]) cout<<i<<endl;
return 0;
}