【九度】题目1040:Prime Number

108 篇文章 0 订阅
102 篇文章 5 订阅
题目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
****************************************************************/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值