题目描述:
Output the k-th prime number.
输入:
k≤10000
输出:
The k-th prime number.
样例输入:
3
7
样例输出:
5
17
参考代码:
#include<cstdio>
#include<iostream>
using namespace std;
/*
在筛选素数时,为减少时间可以令j=i*i(因为k<i时,已经由k的倍数标记过了,从而可以减少时间)
但是该优化在1000个数以内的筛选是可以的,在我的笔记本上,当筛选到4793个素数时,程序出现运行终止,(排除存储素数的数组越界的情况)
而j=2*i就不会出现该类情况,即该算法有不知道什么样的不稳定性。
但是倘若添加if (i >= 1000) continue;(因为1000的平方是1000000),结果却正常!
*/
#define N 104735
int prime[N];//第1000个素数是7919,第10000个素数是104729,第1000000个素数是15485863
int primeSize;
bool mark[N];
void init()
{
for (int i = 0; i < N; i++) mark[i] = false;
primeSize = 0;
for (int i = 2; i <N; i++) {//10W,在该范围内,我的机器竟然跑不动?
if (mark[i] == true) continue;
prime[primeSize++] = i;
// printf("%d,%d\n", primeSize,i);
if (i >= 1000) continue;//必须要添加该句
for (int j = i*i; j < N; j+=i)
mark[j] = true;
/*if (mark[i] == false) {
prime[primeSize++] = i;
for (int j = i+i; j < N; j += i) {
mark[j] = true;
}
}*/
}
}
int main() {
int n;
init();
while (scanf("%d", &n) != EOF) {
printf("%d\n", prime[n - 1]);
}
return 0;
}