【九度】题目1040:Prime Number

题目1040:Prime Number
时间限制:1 秒内存限制:32 兆特殊判题:否提交:3515解决:1453
题目描述
Output the k-th prime number.
输入
k≤10000
输出
The k-th prime number.
样例输入
3
7
样例输出
5
17
来源
2008年上海交通大学计算机研究生机试真题
答疑
解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7764-1-1.html
【解题思路】
筛除法求素数
1、将所有的数放在一数,存在数组中。
2、如果是偶数,那肯定不可能是素数,用0标记。是奇数,用1标记。
3、但是1不是素数,2是素数。
4、从3开始,如果当前数是i的k倍,那么肯定不是素数。
5、最后统计结果。

Java AC

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
 
public class Main {
    /*
     * 1040 2014年6月29日11:08:22
     */
    private static int len;
    public static void main(String[] args) throws Exception {
        len = 200000;
        int array[] = getPrimeArray();
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int k = (int) st.nval;
            int count = 0;
            for (int i = 1; i < len; i++) {
                if (array[i] != 0) {
                    count++;
                }
                if (count == k) {
                    System.out.println(i);
                    break;
                }
            }
        }
    }
 
    private static int[] getPrimeArray() {
        int array[] = new int[len];
        for (int i = 1; i < len; i++) {
            if (i % 2 == 0) {
                array[i] = 0;
            } else {
                array[i] = 1;
            }
        }
        array[1] = 0;
        array[2] = 1;
        for (int i = 2; i < len; i++) {
            if (array[i] == 1) {
                for (int j = 2 * i; j < len; j += i) {
                    array[j] = 0;
                }
            }
        }
        return array;
    }
}
/**************************************************************
    Problem: 1040
    User: wangzhenqing
    Language: Java
    Result: Accepted
    Time:100 ms
    Memory:17264 kb
****************************************************************/
C++ AC
#include <stdio.h>
const int len = 200000;
int array[len];
int i, j, k;
 
void initArray(){
    for(i = 1; i < len; i++){
        if(i % 2 == 0){
            array[i] = 0;
        }else{
            array[i] = 1;
        }
    }
    array[1] = 0;
    array[2] = 1;
    for(i = 3; i < len; i++){
        if(array[i] == 1){
            for(j = 2 * i; j < len; j += i){
                array[j] = 0;
            }
        }
    }
}
int main(){
    initArray();
    while(scanf("%d", &k) != EOF){
        int count = 0;
        for(int i = 1; i < len; i++){
            if(array[i] == 1){
                count++;
            }
            if(count == k){
                printf("%d\n", i);
                break;
            }
        }
    }
    return 0;
}
/**************************************************************
    Problem: 1040
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1800 kb
****************************************************************/


你可能感兴趣的:(【九度】题目1040:Prime Number)