1530 大质数
时间限制: 1 s
空间限制: 1000 KB
题目等级 : 黄金 Gold
题目描述 Description
小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来。(1<=n<=100000)
老师随机写了几个数,交给了小明。小明百度找了很久,都没能解决。现在交给聪明的你。请你帮忙!
————————————————————————————————————————————
简单描述:把第n个质数找出来。
输入描述 Input Description
一个正整数n。
(1<=n<=100000)
输出描述 Output Description
第n个质数。
(第1个质数为2,第2个质数为3。)
样例输入 Sample Input
样例1
2
样例2
65
样例3
20133
样例输出 Sample Output
样例1
3
样例2
313
样例3
226381
数据范围及提示 Data Size & Hint
有大数据等着你,小心超时,不许交表哦。
(1<=n<=100000)
代码:
欧拉筛 暴内存。。。。
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 200010 using namespace std; bool not_prime[N]; int n,ans,sum,tot,prime[N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();} return x*f; } void Euler_sieve() { memset(not_prime,0,sizeof(not_prime)); for(int i=2;i<=N;i++) { if(!not_prime[i]) prime[++tot]=i; for(int j=1;j<=tot;j++) { if(i*prime[j]>N) break; not_prime[i*prime[j]]=1; if(!i%prime[j]) break; } } } int main() { n=read(); Euler_sieve();not_prime[1]=1; for(int i=1;i<=N;i++) if(!not_prime[i]) { sum++; if(sum==n) {printf("%d",i);return 0;} } }
枚举 ac。。。
注意运算符的优先级!!!
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; int n,ans,sum,tot; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();} return x*f; } bool pd(int x) { for(int j=2;j*j<=x;j++) if(x%j==0) return false; return true; } int main() { n=read();tot=1;ans=2; for(int i=3;tot<n;i+=2) if(pd(i)) ans=i,tot++; printf("%d",ans); return 0; }
时间: 2024-10-30 14:55:44