题目描述
已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。
输入描述
输入只有一行,包含一个正整数n。
输出描述
输出只有一行,包含一个正整数p,即较大的那个质数。
样例输入 1
21
样例输出 1
7
提示
【数据范围】
对于60%的数据,6≤n≤1000。
对于100%的数据,6≤n≤2*10^9 。
代码及思路:
/*
出错点:题目是一个数等于两个数的质数的乘积,容易忽略质数这个条件
解题思路:先输入整数N,然后从i从2开始遍历(循环)到N-1, 若N能够整除i
同时N的积的分解是两个质数时,则最大质数就是N除以i的结果。因为i是从2开始的
一旦第一次出现N整除i,则说明N/i是最大的(N一定,第一次出现整除则,i最小)
*/
#include<stdio.h> //头文件
#include<math.h> //数学函数的声明(下文用到了sqrt函数)
int maxNum(int n);//最大质数的函数声明
int judge(int m);//判断一个数是否是质数的函数声明
/*主函数*/
int main(void){
int n;
scanf("%d",&n);//N的输入
printf( "%d",maxNum(n) );//输出最大质数(调用了函数)
return 0;
}
/*最大质数的函数声明 */
int maxNum(int n){
int i,temp,temp1,temp2;
for(i=2;i<n;i++){
if(n%i==0){
temp1=i;//temp1和temp2用来存放N的两个积
temp2=n/i;
if( judge(temp1)&&judge(temp2) ){//判断是否是质数
return temp2;//返回最大质数
}
}
}
}
/*
判断素数(质数)
*/
int judge(int m){
int i,t;
for(i=2;i<=sqrt(m);i++){
if(m%i==0){//如果m能够整除i则跳出循环
break;
}
}
if( i==( (int)sqrt(m) +1 ) ){
t=1;
}else{
t=0;
}
return t;
}