P9750 [CSP-J 2023] 一元二次方程 题解

大模拟

此题大模拟即可,只需注意几点:

  1. 分母\(>0\).

  2. 要给根式化简.

  3. 分数要约分.

  4. 求较大根,那就 \(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;
}
posted @ 2024-10-22 21:30  Panda_LYL  阅读(35)  评论(0)    收藏  举报