九度 题目1040:Prime Number
原题OJ链接:http://ac.jobdu.com/problem.php?pid=1040
题目描述:
Output the k-th prime number.
输入:
k≤10000
输出:
The k-th prime number.
样例输入:
3
7
样例输出:
5
17
解题思路:
题意就是输出第k个素数,k<=10000,按照《王道机试指南》上的素数筛法会出错。错误如下图:
原因是 素数筛法内层循环处,j从i*i开始,原因是这样会溢出,i最大为200000,i*i的最大值为400,0000,0000这样就溢出了,从i*i开始会提高时间效率,但存在溢出的风险,本题便是一例。改成j从2*i开始就解决了。如下图:
源代码:
#include<iostream>
#include<cstring>
using namespace std;
#define MAX_K 200000
int prime[10001];
bool mark[MAX_K+1];
int primeSize;
void init(){
primeSize=1;
memset(mark,0,sizeof(mark));
for(int i=2;i<=MAX_K;i++){
if(mark[i]==true) continue;
else prime[primeSize++]=i;
for(int j=2*i;j<=MAX_K;j=j+i){
// 错误代码:j从i*i开始,原因是这样会溢出,i最大为200000
// i*i的最大值为400,0000,0000这样就溢出了,从i*i开始会提高
// 时间效率,但存在溢出的风险,本题便是一例
mark[j]=true;
}
}
}
int main(){
init();
int k;
while(cin>>k){
cout<<prime[k]<<endl;
}
return 0;
}