1.第n小质数
描述
输入一个正整数n,求第n小的质数。
输入
一个不超过10000的正整数n。
输出
第n小的质数。
样例:
样例输入 10 样例输出 29
方法:合数一定可以表示成一个比它小的质数的几倍,所以若一个数不能整除比它小的所有的质数,则这个数是质数。
代码实现:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int n,z[100001],s; bool pd; int search(double tmp) { int k=(int)tmp;//将tmp强制转换成int类型,并赋值给k for(int i=1; i<=s; i++) { if(z[i]>=k)//如果有一个质数必要查找的数大 return i+1;//因为tmp是强制转换的,比原数要小,所以i+1,宁大勿小 } } int main() { cin>>n; z[1]=2,z[2]=3;//第一个质数为2,第二个质数为3 s=2;//目前有2个质数 while(s<n) { int tmp=z[s];//把目前最大的质数赋值给tmp s++;//质数的个数先加一 while(1) { tmp++;//下一个质数至少比目前的大一 pd=false;//将pd初始化为false int hind=search(sqrt(tmp));//找到要判断的数位于哪两个质数之间 /*例:15=3*5,枚举到3时判断了一次,5时又判断了一次, 造成重复判断。所以判断能否整除比它小的所有的质数, 仅需判断到根号n即可*/ for(int i=1; i<=hind; i++) { if(tmp%z[i]==0) { //如果要查找数能够被一个质数整除,那它就不是质数 pd=true; break; } } if(pd) continue;//如果不是质数,跳出寻找下一个数 z[s]=tmp;//如果找到一个质数,把它存到数组中 break; } } cout<<z[n]<<endl; return 0; }
2.质因数分解
描述
已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。
输入
输入只有一行,包含一个正整数 n。
对于60%的数据,6 ≤ n ≤ 1000。
对于100%的数据,6 ≤ n ≤ 2*10^9。
输出
输出只有一行,包含一个正整数 p,即较大的那个质数。
样例:
样例输入 21
样例输出 7
根据唯一分解定理,若此题有答案,则输入数据满足有且只有一组质数相乘=n。
代码实现:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 cin>>n; 10 int t=sqrt(n); 11 for(int i=2;i<=t;i++) 12 { 13 if(n%i==0)//根据唯一分解,题目保证有解,所以依次枚举,如果有一个数能整除n,则为较小的质数 14 { 15 cout<<n/i<<endl;//n/i则为较大的质数 16 return 0; 17 } 18 } 19 }