☀️☃️☃️☃️☀️ • 7天前
#include<iostream>
#include<cmath>
#include <vector>
using namespace std;
int getGcd(int x, int y) {//求最大公约数
x = abs(x); //因为后续还要约分,最大公约数算出是正数比较好处理
y = abs(y);
while (x % y) {
int t = x % y;
x = y;
y = t;
}
return y;
}
int main() {
int t, m, a, b, c, gcd, ta;
cin >> t >> m;
while (t--) {
cin >> a >> b >> c;
if (a < 0) { //因为2*a是作为分母,不应输出负号
a = -a; //所有系数*-1对结果没有影响
b = -b;
c = -c;
}
int delta = b * b - 4 * a * c;
if (delta < 0) {
cout << "NO" << endl;
continue;
}
else if (delta == 0) {
if (b == 0) {
cout << 0 << endl;
continue;
}
gcd = getGcd(-b, 2 * a); //-b和2*a约分
b = -b / gcd;
a = 2 * a / gcd;
cout << b;
if (a != 1) cout << "/" << a;
cout << endl;
continue;
}
vector<pair<int, int>> list;
for (int i = 2; delta > 1; i++) if (delta % i == 0) { //质因数分解
int cnt = 0;
while (delta % i == 0) {
delta /= i;
cnt++;
}
list.push_back({ i,cnt });
}
int w = 1, g = 1; //w表示根号外的数字 g根号内的数字
for (auto p : list) {
w *= pow(p.first, p.second / 2);
if (p.second % 2 == 1) g *= p.first;
}
if (g > 1) { //如果有根号部分,需要分两部分输出
if (b != 0) { //有前半部分
gcd = getGcd(-b, 2 * a);
b = -b / gcd;
ta = 2 * a / gcd; //约分
if (ta == 1) cout << b << "+"; //要跟加号
else cout << b << "/" << ta << "+"; //如果除数还有,则输出除数
}
gcd = getGcd(w, 2 * a);
w /= gcd;
ta = 2 * a / gcd; //根号外数字和2*a约分
if (w != 1) cout << w << "*"; //如果根号外有输出
cout <<"sqrt(" << g << ")";
if (ta != 1) cout << "/" << ta; //如果除数还有,则输出除数
cout << endl;
}
else { //如果没有根号部分
b = -b + w; //根号部分和b合并
gcd = getGcd(b, 2 * a);
b /= gcd;
a = 2 * a / gcd;//约分
if (a == 1) cout << b << endl;
else cout << b << "/" << a << endl;//如果除数还有,则输出除数
}
}
return 0;
}
评论:
请先登录,才能进行评论