题目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、最后统计结果。
时间限制: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
****************************************************************/