题目描述
已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。
【输入】
输入只有一行,包含一个正整数 n。
对于60%的数据,6≤n≤1000。
对于100%的数据,6≤n≤2×10^9。
【输出】
输出只有一行,包含一个正整数 pp,即较大的那个质数。
【输入样例】
21
【输出样例】
7
思路分析
首先会给我们一个不同质数的乘积n,让我们拆解,从而得到n的两个质数因子中较大的那个。
所以我们可以先判断一个数是不是素数,再判断是不是n的因子,又因为要较大的一个,可以从n-1开始判断,例如
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main()
{
long long n;
cin >> n;
for (int i = n - 1; i >= 2; i--)
{
int j;
for ( j = 2; j < n && i % j != 0; j++);//判断i是否为质数
if (i % j == 0)
{
continue;//如果i不是质数则进到下一个循环去判断i+1
}
else//i是质数则判断是不是n的质因子
{
if (n%i==0)//是的话就找到了输出i
{
cout << i;
}
}
}
}
但是我们发现如果n太大的话时间复杂度会很高,容易超时!
所以我们通过质数的一个性质可以很轻松的找到我们的目标数
即
两个质数之积是唯一的,并且没有除1和本身以及这两个质数之外其他的因子。
所以我们就直接来判断其中的较小质数因子p,然后输出n/p就完美解决问题了,并且p最大不会超过sqrt(n),即根号n
代码如下
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main()
{// 两个质数的乘积不能被其它数整除
long long n;
cin >> n;
for (int i = 2; i*i <= n; i++)
{//找到一个最小的质因子i剩下的就是最大的质因子n/i
if (n % i == 0)
{
cout << n / i;
return 0;
}
}
}


1179

被折叠的 条评论
为什么被折叠?



