一般来说,判断素数就遍历到sqrt(n),来看能不能被n整除。但是复杂度为O(n^2)过高,所以需要优化打表方法。
注意i是素数,我再去筛选,这样节省很多时间,因为你合数还是可以用素数表示,所以没必要用合数去筛选。
然后要将素数i的倍数——合数都设置标识,注意j从i*i开始循环,其实就是从i个i开始循环,因为比如j=i*k(k<i)即k个i,其实已经被前面的i个k给设置过了。
另外需要注意的是,代码中在判断if(is_prime[i])成功之后,这个i就一定是素数了,因为判断你是不是素数只是从你前面比你小的数来处理判断的,所以这时候其实可以进行素数的存储了,方便取“第几个素数”:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int prime[1001500];
int store[1001500];
int cnt=1;
void set_prime()
{
for(int i=2;i<=1001000;i++)
prime[i]=1; //素数是1,合数是2
for(int i=2;i<=1001000;i++)
{
if(prime[i]==1)
{
store[cnt++]=i; //i一定是素数了,可以进行存储
for(int j=i*i;j<=1001000;j+=i)
prime[j]=2;
}
}
}
int main()
{
set_prime();
int n;
while(scanf("%d",&n)!=EOF)
{
cout<<store[n]<<endl; //直接取第n个素数
}
return 0;
}