题目1040:Prime Number
时间限制:1 秒
内存限制:32 兆
特殊判题:否
-
题目描述:
-
Output the k-th prime number.
-
输入:
-
k≤10000
-
输出:
-
The k-th prime number.
-
样例输入:
-
3 7
-
样例输出:
-
5 17
-
来源:
- 2008年上海交通大学计算机研究生机试真题
- 方法一:数组遍历
-
#include <stdio.h> #include <math.h> //判断是否是素数 int IsPrime(int n){ if(n<=1) return 0; int sq = (int)sqrt(n)+1; while(sq >= 2){ if(n%sq == 0) break; --sq; } return (sq>=2)?0:1; } int main(){ int a=1,ans[10001]; for(int i=2;;i++){ if(i == 2){ ans[a]=2; a++; continue; } if(IsPrime(i)==1){ ans[a]=i; a++; } if(a>10000) break; } int k; while(scanf("%d",&k)!=EOF){ printf("%d\n",ans[k]); } return 0; } /************************************************************** Problem: 1040 User: zpy Language: C++ Result: Accepted Time:90 ms Memory:1032 kb ****************************************************************/
-
方法二:判断素数与数组遍历同时进行
-
方法三:素数筛法#include<stdio.h> int k[10001]; int main(int argc, char *argv[]) { k[1]=2; int index=1; int i,j; int num; int tmp; while(scanf("%d",&num)!=EOF) { if(index>=num) printf("%d\n",k[num]); else { for(i=index+1;i<=num;++i) { tmp=k[i-1]+1; while(1){ for(j=1;j<=index;++j) { if(tmp%k[j]==0) break; } if(j<=index) tmp++; else { k[i]=tmp; index++; break; } } } printf("%d\n",k[num]); } } return 0; } /************************************************************** Problem: 1040 User: zpy Language: C++ Result: Accepted Time:250 ms Memory:1060 kb ****************************************************************/
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; #define M 1000010 bool flag[M]; int prime[M]; void getprime() { int cnt=1; for(int i=2;i<M;++i) { if(!flag[i]) { prime[cnt++]=i; for(int j=i;j<M;j+=i) flag[j]=true; } } } int main(int argc, char *argv[]) { int k; getprime(); prime[0]=0; while(scanf("%d",&k)!=EOF) { printf("%d\n",prime[k]); } return 0; } /************************************************************** Problem: 1040 User: zpy Language: C++ Result: Accepted Time:10 ms Memory:6400 kb ****************************************************************/