65 lines
2.2 KiB
C++
65 lines
2.2 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
|
||
int main() {
|
||
freopen("uqe.in", "r", stdin);
|
||
freopen("uqe.out", "w", stdout);
|
||
|
||
|
||
int T, m;
|
||
cin >> T >> m; // 方程数和系数的绝对值上限,这个m后面没有用到
|
||
while (T--) {
|
||
int a, b, c;
|
||
cin >> a >> b >> c; // 方程的a,b,c
|
||
int delta = b * b - 4 * a * c;
|
||
|
||
// 上来先判断
|
||
if (delta < 0) {
|
||
cout << "NO" << endl;
|
||
continue;
|
||
}
|
||
|
||
a = 2 * a;
|
||
b = -b;
|
||
if (a < 0) { // 当a<0时,对a和b进行处理,让a<0和a>0,都是统一解,使得x1=(-b+sqrt(b^2-4ac))/2a是最大值
|
||
a = -a;
|
||
b = -b;
|
||
}
|
||
|
||
int q = 1, r = delta; // q:根号系数,r:通过初始值delta不断开根号,剩余到根号里面的数值
|
||
for (int i = 2; i * i <= r; i++) {
|
||
while (r % (i * i) == 0) { // 如果i*i是r的因子,i可以开方出去
|
||
q = q * i; // 记录根号外的系数
|
||
r = r / (i * i); // r在变小
|
||
}
|
||
}
|
||
|
||
if (r == 1) { // 完全平方数
|
||
delta = 0;
|
||
b += q;
|
||
}
|
||
|
||
int gcd1 = __gcd(abs(b), a); // 分裂式第一项的最大公约数
|
||
int gcd2 = __gcd(q, a); // 分裂式第二项的最大公约数
|
||
|
||
if (delta == 0) {
|
||
if (b % a == 0)
|
||
cout << b / a;
|
||
else
|
||
cout << b / gcd1 << "/" << a / gcd1; // 分裂式第一项约分
|
||
} else { // delta>0的场景
|
||
if (b != 0) { // 前半部分的输出,如果b==0,则没有输出
|
||
if (b % a == 0)
|
||
cout << b / a;
|
||
else
|
||
cout << b / gcd1 << "/" << a / gcd1;
|
||
cout << "+";
|
||
}
|
||
if (q / gcd2 != 1) cout << q / gcd2 << "*";
|
||
cout << "sqrt(" << r << ")";
|
||
if (a / gcd2 != 1) cout << "/" << a / gcd2; // 处理分母的技巧,==1就不输出
|
||
}
|
||
cout << endl; // 最后统一换行
|
||
}
|
||
return 0;
|
||
} |