111

☀️☃️☃️☃️☀️  •  7天前


#include<iostream>
#include<cmath>
#include <vector>
using namespace std; 
int getGcd(int x, int y) {//求最大公约数
	x = abs(x); //因为后续还要约分,最大公约数算出是正数比较好处理
	y = abs(y);
	while (x % y) {
		int t = x % y;
		x = y;
		y = t;
	}
	return y;
}
int main() {
	int t, m, a, b, c, gcd, ta;
	cin >> t >> m;
	while (t--) {
		cin >> a >> b >> c;
		if (a < 0) { //因为2*a是作为分母,不应输出负号
			a = -a; //所有系数*-1对结果没有影响
			b = -b;
			c = -c;
		}
		int delta = b * b - 4 * a * c;
		if (delta < 0) {
			cout << "NO" << endl;
			continue;
		}
		else if (delta == 0) {
			if (b == 0) {
				cout << 0 << endl;
				continue;
			}
			gcd = getGcd(-b, 2 * a); //-b和2*a约分
			b = -b / gcd;
			a = 2 * a / gcd;
			cout << b;
			if (a != 1) cout << "/" << a;
			cout << endl;
			continue;
		}
		vector<pair<int, int>> list;
		for (int i = 2; delta > 1; i++) if (delta % i == 0) { //质因数分解
			int cnt = 0;
			while (delta % i == 0) {
				delta /= i;
				cnt++;
			}
			list.push_back({ i,cnt });
		}
		int w = 1, g = 1; //w表示根号外的数字 g根号内的数字
		for (auto p : list) {
			w *= pow(p.first, p.second / 2);
			if (p.second % 2 == 1) g *= p.first;
		}
		if (g > 1) { //如果有根号部分,需要分两部分输出
			if (b != 0) { //有前半部分
				gcd = getGcd(-b, 2 * a);
				b = -b / gcd;
				ta = 2 * a / gcd; //约分
				if (ta == 1) cout << b << "+"; //要跟加号
				else cout << b << "/" << ta << "+"; //如果除数还有,则输出除数
			} 
			gcd = getGcd(w, 2 * a);
			w /= gcd;
			ta = 2 * a / gcd; //根号外数字和2*a约分
			if (w != 1)  cout << w << "*"; //如果根号外有输出
			cout <<"sqrt(" << g << ")";
			if (ta != 1) cout << "/" << ta; //如果除数还有,则输出除数
			cout << endl;
		}
		else { //如果没有根号部分
			b = -b + w; //根号部分和b合并
			gcd = getGcd(b, 2 * a);
			b /= gcd; 
			a = 2 * a / gcd;//约分
			if (a == 1) cout << b << endl;
			else cout << b << "/" << a << endl;//如果除数还有,则输出除数
		}
	}
	return 0;
}

评论:

请先登录,才能进行评论