Rinne Loves Math
链接:https://ac.nowcoder.com/acm/contest/370/J
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
Rinne 刚刚学习了最简二次根式,于是她想用程序实现一个。
为了简化问题,在本题中,最简二次根式 a√bab 的定义为:
不存在b的一个因子k s.t. ∃x∈N∗,x2=k不存在b的一个因子k s.t. ∃x∈N∗,x2=k
即根号下的数字不含平方数因子。
举个最简二次根式的例子:√5,√200501175,20050117
举个不是最简的例子:√20,√44420,444
现在 Rinne 给了你形如 √nn 的式子中的 n,让你输出化简后的结果 a√bab 中的 a,b,如果这样的式子在实数范围内没有意义,输出 -1。
输入描述:
第一行一个整数 T,表示数据组数。 接下来 T 行,每行一个整数 x 表示根号下的数。
输出描述:
输出一共 T 行,每行两个数表示 √xx 化简后的答案 a,b
示例1
输入
4 20 25 -2005 11
输出
2 5 5 1 -1 1 11
说明
20=4×520=4×5 25=5×525=5×5 实数范围内 √nn中 n 小于 0 没有意义。 11 是个质数。
备注:
T≤100,0<|x|≤1e7
暴力解题....
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int t;
int judge(int num)
{
int v = sqrt(num);
for(int i = t; i <= v; i++)
{
if(num % i == 0)
{
int num1 = num / i;
if(num1 % i == 0 && num1)
{
return i * i;
}
}
}
return 0;
}
int main()
{
int n;
scanf("%d", &n);
while(n--)
{
t = 2;
int num;
scanf("%d", &num);
if(num < 0)
{
printf("-1\n");
continue;
}
int flag = judge(num);
int ans=1;
if(!flag)
{
printf("%d %d\n", ans, num);
continue;
}
ans = sqrt(flag);
num = num / flag;
while(1)
{
int num1 = judge(num);
if(num1 == 0)
break;
if(num1! = 1)
{
ans = ans * sqrt(num1);
num = num / num1;
}
}
printf("%d %d\n", ans, num);
}
}