九度OJ题目1040-Prime Number

题目描述:

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;
}

 

上一篇:1040 有几个PAT (25 分


下一篇:1040 有几个PAT