有没有大佬帮个忙,这是我去年 CSP 的意难平,真的非常想订正出来,写了好久叻,一看到就会想到去年爆炸的 CSP,谢谢!
#include <bits/stdc++.h>
using namespace std;
int T, M;
int find(int delta) {
int ans;
for (int i = 1; i * i < delta; i++) {
if (delta % (i * i) == 0) {
ans = i;
}
}
return ans;
}
signed main() {
cin >> T >> M;
while (T--) {
int a, b, c, delta;
bool Q = false;
cin >> a >> b >> c;
delta = b * b - 4.0 * a * c;
if (delta < 0) {
puts("NO");
continue;
}
int tmp = sqrt(delta);
if (tmp * tmp == delta) Q = true;
if (Q) {
int u1 = (-b + tmp), u2 = (-b - tmp), d = 2 * a;
double x1 = 1.0 * u1 / d, x2 = 1.0 * u2 / d;
double x = max(x1, x2);
bool tab = false;
u1 = abs(u1), u2 = abs(u2), d = abs(d);
if (x < 0) {
tab = true;
}
if (x == floor(x)) cout << x << '\n';
else {
if (tab) printf("-");
if (x == x1) {
int gcd = __gcd(u1, d);
u1 /= gcd, d /= gcd;
printf("%d/%d\n", u1, d);
} else {
int gcd = __gcd(u2, d);
u2 /= gcd, d /= gcd;
printf("%d/%d\n", u2, d);
}
}
} else {
int u1 = -b, u2 = delta, d1 = 2 * a, d2 = 2 * a;
double x = 1.0 * u1 / d1;
u1 = abs(u1), d1 = abs(d1), d2 = abs(d2);
int gcd = __gcd(u1, d1);
u1 /= gcd, d1 /= gcd;
bool tab1 = false, tab2 = false; //tab1 记录有理数部分的正负, tab2 记录选的 delta 的正负
if (a < 0) {
tab2 = true;
}
if (x < 0) {
tab1 = true;
}
if (x == floor(x) && x != 0) cout << x << '+';
else if (x != 0) {
if (tab1) printf("-");
printf("%d/%d+", u1, d1);
}
int k = find(u2);
u2 /= k * k;
gcd = __gcd(k, d2);
k /= gcd, d2 /= gcd;
if (k != 1) {
printf("%d*", k);
}
printf("sqrt(%d)", u2);
if (d2 != 1) {
printf("/%d", d2);
}
puts("");
}
}
return 0;
}