P9750 [CSP-J 2023] 一元二次方程 题解
大模拟
此题大模拟即可,只需注意几点:
-
分母\(>0\).
-
要给根式化简.
-
分数要约分.
-
求较大根,那就 \(b^2\) 加 $\bigtriangleup $ 即可.
分母 > 0
因为求根公式中,分母中只有 \(a\) 一个未知数,所以我们只需保证 \(a > 0\) 即可.
所以,当 \(a < 0\) 时,我们把 \(a,b,c\) 全部取相反值.但这也是有条件的,具体得看题目情况.
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int T, M, gt;
int gcd(int a, int b) {
if (b == 0) return a;
else return gcd(b, a % b);
}
int main() {
scanf("%d%d", &T, &M);
while (T--) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (a < 0) a = -a, b = -b, c = -c; // 预处理分母 > 0
int d = b * b - 4 * a * c;
if (d < 0) { // 无实数根
printf("NO\n");
continue;
}
int f = 1, i = 2;
// f : 系数
// 化简根式
while (i * i <= d) {
while (d % (i * i) == 0) {
f *= i, d /= (i * i);
}
i++;
}
if (d == 0 || d == 1) { // 是有理数
gt = abs(gcd(-b + f * d, 2 * a)); // 最大公因数
printf("%d", (-b + f * d) / gt);
if (2 * a / gt != 1) // 分母不是 1 的情况
printf("/%d", 2 * a / gt);
printf("\n");
}
else { // 无理数
gt = abs(gcd(-b, 2 * a)); // 分开求
if (-b / gt != 0)
printf("%d", -b / gt);
if (2 * a / gt != 1)
printf("/%d", 2 * a / gt);
if (-b / gt != 0)
printf("+");
gt = abs(gcd(f, 2 * a));
if (f / gt != 1) printf("%d*", f / gt); // 系数不省略的情况
printf("sqrt(%d)", d);
if (2 * a / gt != 1) printf("/%d", 2 * a / gt);
printf("\n");
}
}
return 0;
}