题目描述:
一个整数 a 是一个完全平方数,是指它是某一个整数的平方,即存在一个整数 b,使得 a=b^2。
给定一个正整数 n,请找到最小的正整数 x,使得它们的乘积是一个完全平方数。
输入格式:
输入一行包含一个正整数 n。
输出格式:
输出找到的最小的正整数 x。
数据范围:
对于 30% 的评测用例,1≤n≤1000,答案不超过 1000。
对于 60% 的评测用例,1≤n≤1e8,答案不超过 1e8。
对于所有评测用例,1≤n≤1e12,答案不超过 1e12。
输入样例1:
12
输出样例1:
3
输入样例2:
15
输出样例2:
15
分析步骤:
第一:分析思路:
-
这道题目题意很简单了,就是要我们求出哪一个数相乘是完全平方数。我们先想想什么是完全平方数,题目中说是指它是某一个整数的平方,即存在一个整数 b,使得 a=b^2。我们初中也学过无论是什么数都可以拆分成很多质因子的指数的乘积,所以呢!我们就把这个数拆开成质因子的指数的乘积,看看哪一个质因子不是偶数个那么我们就得把这个数乘上,直到使得这个质因子的指数都是偶数的时候就代表它可以拆开成另一个数的平方。这个思路极其巧妙,大家可以看一看提升一下自己的思维面。
第二:书写主函数,构建整体框架:
-
输入值,定于res让它去乘上那些指数是奇数的值。
-
我们用for循环从2开始,因为2是最小的质因子。
-
如果i是n的质因子的话,就进入while循环将i这个质因子除干净,记录一下有几个这样的i,如果是奇数个的话,我们就得让res去乘上i,如果已经是偶数的话,就不用去乘。
-
最后,我们经过for循环之后的n如果是大于1的话,就代表这也是一个质因子,且只有它自己,我们还得乘上这个东西。最后输出出来,就可以得出答案了。
int main()
{
LL n;
cin >> n;
LL res = 1;
for (LL i = 2; i * i <= n; i ++ )
if (n % i == 0)
{
int s = 0;
while (n % i == 0) s ++, n /= i;
if (s % 2) res *= i;
}
if (n > 1) res *= n;
cout << res << endl;
return 0;
}
tip:这道题思路还有很多,但这个思路真的比较巧妙,而且速度也极快。大家可以学学!
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL n;
cin >> n;
LL res = 1;
for (LL i = 2; i * i <= n; i ++ )
if (n % i == 0)
{
int s = 0;
while (n % i == 0) s ++, n /= i;
if (s % 2) res *= i;
}
if (n > 1) res *= n;
cout << res << endl;
return 0;
}