九度 題目1040:Prime Number

九度 題目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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章