九度 題目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;
}