0pts 求助
查看原帖
0pts 求助
970052
封禁用户楼主2024/8/8 14:50

有没有大佬帮个忙,这是我去年 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;
}
2024/8/8 14:50
加载中...