输入 第一行包含一个正整数k。然后跟随k个正整数(每行一个)。数字不超过15000。 输出量 对于每个数字n,输出第n个按序素数。每个数字都应在其行中。
#include <iostream>
#include <vector>
#include <math.h>
long long getNthPrime(int n)
{
long long size{};
if(n<11)
{
size=n*n;
}
else{
size=n*log(n)*log(n);
}
std::vector<int>is_prime(size+1, 1);
is_prime[0]=is_prime[1]=0;
is_prime[2]=1;
int count=1;
if(n==1)
{
return 2;
}
for(long long i=3; i<=size; i+=2)
{
if(is_prime[i]==1)
{
count++;
if(count==n)
{
return i;
}
for(long long j=i*i; j<=size; j+=i)
{
is_prime[j]=0;
}
}
}
}
int main() {
int n, k;
std::cin>>k;
std::vector<int>arr;
for(int i=0; i<k; i++)
{
std::cin>>n;
arr.push_back(n);
}
for(int i=0; i<k; i++)
{
std::cout<<getNthPrime(arr[i])<<std::endl;
}
}
它给出“时间限制”错误消息。我检查了好几次,看看是否有什么问题,但我找不到。任何提示将不胜感激
答案 0 :(得分:4)
对于每个数字n,您将生成一个完整的素数序列,直到n。这是巨大的时间浪费。
FYI,第15000个素数是163841(从2开始为第1个);我建议您将163841个元素做成sieve of Eratosthenes,这将为您提供一次回答查询所需的全部15000个素数;然后将它们收集到15000个元素的数组中;然后才开始遍历输入数字并查找它们,它们应该是超快的(因为它只是纯数组查找)。