大模拟
此题大模拟即可,只需注意几点:
-
分母$>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;
}
标签:int,题解,d%,分母,一元二次方程,include,CSP
From: https://www.cnblogs.com/panda-lyl/p/18493781