时间复杂度:O(n)
比埃氏筛快,埃筛重复筛了许多数,如6被2筛了一次,又被3筛了一次
思路:从2开始遍历,是素数就装起来,任一合数只被:“最小质因数 × 最大因数(非自己) = 这个合数”的途径筛除,这样保证合数只被筛除一次,只有唯一的筛除途径。
如何确保是最小质因数:比如8执行完8 * 2(2是自然数中最小的质因数),如果说现在不退出循环,那么下一步8 * 3=24,则当前质因数是3,但是我们知道8的最小质因数是2(因为8%sushu[i]==0且循环为递增),那么很显然这里的3大于2,那就不满足唯一途径的等式了,8里面藏着2这个更小的质因数,继续循环下去,后面的质因数又必然大于2,因此12 * 2(即2 * 4 * 3)才符合。
洛谷例题
#include <iostream>
#define maxn 100000000+10
using namespace std;
int flag[maxn];//0为素数,1为合数
int sushu[maxn];
int main()
{
int n,k,l,Count=0;//Count为指针
cin>>n;
for(int i=2;i<=n;i++)
{
if(!flag[i])//如果这个数为素数
{
sushu[++Count]=i;
}
for(int j=1;j<=Count&&i*sushu[j]<=n;j++)
{
flag[i*sushu[j]]=1;
if(i%sushu[j]==0)break;
}
}
cin>>k;
for(int i=1;i<=k;i++)
{
cin>>l;
cout<<sushu[l]<<endl;
}
return 0;
}