筛到第 n 个素数,数组需要开多大?
素数分布定理: 不大于 n 的素数的个数为: n/ln(n)
double t = 100;
while(t/log(t) < n) t *= 1.1;
cout<<t<<endl;
题目:
第1个素数是2,第2个素数是3,……
求第100002(十万零二)个素数。
#include <iostream>
#include <cmath>
using namespace std;
int getArrLen(int n)
{
double t = 100;
while(t/log(t) < n) t *= 1.1;
return t;
}
int main()
{
int N = getArrLen(100002)+10;
bool prime[N];
for (int i=2; i<N; i++) prime[i] = true;
for (int i=2; i*i<N; i++)
{
if (prime[i])
{
for (int j=i*2; j<N; j+=i)
prime[j] = false;
}
}
int sum = 0;
for (int i=2; sum<=100002; i++)
{
if (prime[i]) sum ++;
if (sum == 100002)
{
cout<<i<<endl;
break;
}
}
return 0;
}
输出:
1299743