整体思路,先把所有的数字设置为1(素数),之后遍历,若等于1,即为素数,若不为1,则是合数。
每次遍历一个新的数,要把之前所有的素数与他相乘,把得到的结果设置为0(合数)。
注意最后要
if(i % prime[j] == 0)//i中也含有Prime[j]这个因子
break; //重要步骤。见原理
因为如果i包含有质数prime[j] ,那么之前这个i已经被设置为质数了,所以直接退出即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <queue>
#include<iomanip>
#include<fstream>
using namespace std;
int n,q;
bool isprime[100000010];
int prime[1000010];
int num[100010];
int main ()
{
cin>>n>>q;
int cnt=0;
memset(isprime,1,sizeof isprime);
isprime[1]=0;
for (int i=2;i<=n;i++){
if (isprime[i]==1){
cnt++;
prime[cnt]=i;
}
for (int j=1;j<=cnt&& i*prime[j]<=n;j++){
isprime[i*prime[j]]=0;
if(i % prime[j] == 0)//i中也含有Prime[j]这个因子
break; //重要步骤。见原理
}
}
int d;
for (int i=1;i<=q;i++){
scanf("%d",&d);
printf("%d\n", prime[d]);
}
return 0;
}