---恢复内容开始---
- 描述
-
输入一个正整数n,求第n小的质数。
- 输入
- 一个不超过10000的正整数n。
- 输出
- 第n小的质数。
- 样例输入
-
10
- 样例输出
-
29
#include<iostream> using namespace std; int n,s; ]; int pan(int t) { ) { ; ;i<=s;i++)//若它是质数,则不不能整除比它小的所有的质数 ) { ok=;break; } if(ok) { t++;continue; } return t; } } int main() { cin>>n; p[]=;s++;//s表示当前质数数目 ;i<=n;i++) { ;//下一个质数的至少比上一个质数大1 int h=pan(t);//确定下一个质数 p[++s]=h; } cout<<p[n]; }
- 方法2:是对方法1的改进,方法1中是判断不能整除所有比它小的质数,结合根号n复杂度判断质数的原理,例:15=3*5,枚举到3时判断了一次,5时又判断了一次,造成重复判断。所以判断能否整除比它小的所有的质数,仅需判断到根号n即可
#include<cstdio> #include<cmath> using namespace std; int n,s; ]; int devide(double k) { int x=(int)k; ;i<s;i++) { if(p[i]>=x) ;//因为开立方后的数k强制转化成了整数x,实际上x比k小了,所以要+1 } } int main() { scanf("%d",&n); p[]=;p[]=; s=; while(s<n) { int tmp=p[s];//上一个质数 s++;//当前要找的是第s个质数 ) { tmp++;//至少比上一个质数大1 bool ok=false; int test=devide(sqrt(tmp));//找到要判断的数开平方后处于哪两个质数之间 ;i<=test;i++) ) { ok=true; break; } if(ok) continue; p[s]=tmp; break; } } printf("%d",p[n]); }
---恢复内容结束---