只过点1 求调
查看原帖
只过点1 求调
936388
Suin_tryin楼主2024/8/17 22:17
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
//这道题充分体现了学好数学的重要性哈哈哈哈哈哈哈
int t, m, a, b, c;
void youli(int p, int q) {
	int gcd = __gcd(p, q);
	q = q / gcd, p = p / gcd;
	if(q < 0) q = -q, p = -p; 
	cout << p;
	if(q != 1) cout << '/' << q;
}
int huajian(int delta) {
	int ans = 1;
	for (int i = 2; i * i <= delta; i ++)
		while(delta % (i * i) == 0)
		{
			ans *= i;
			delta /= i * i;
		}
	return ans;
}
void wuli(double xi, int k, int delta) {
	if(xi == 1 || xi == 0)  cout << "sqrt(" << delta << ")" << endl;
	else if(xi == floor(xi)) cout << abs(xi) << '*' << "sqrt(" << delta << ")" << endl;
	else if(1 / xi == floor(1 / xi) && 1 / xi != 0) cout << "sqrt(" << delta << ")/" << 1 / xi << endl;
	else
	{
		int gcd = __gcd(a * 2, k); //约分
		int q = a * 2 / gcd, p = k / gcd;
		if(q < 0) q = -q, p = -p;
		if(p != 1 && p != 0) cout << abs(p) << '*';
		cout << "sqrt(" << delta << ")/" << abs(q) << endl;
	}
}
int main() {
	cin >> t >> m;
	while(t --) {
		cin >> a >> b >> c;
		int delta = b * b - 4 * a * c; //∆判别式
		if(delta < 0) cout << "NO" << endl; //∆<0无实根
		else if(delta == 0) {
			if(b % (a * 2) == 0) cout << -b / (a * 2) << endl;
			else {
				int gcd = __gcd(a * 2, -b); //约分
				int q = a * 2 / gcd, p = -b / gcd;
				if(q < 0) q = -q, p = -p; //分母不能小于零
				youli(p, q);
				cout << endl;
			}
		}
		else {
			if(sqrt(delta) == floor(sqrt(delta))) { //∆是个整数->分母整数
				int x = -b + sqrt(delta) / (2 * a);
				int y = -b - sqrt(delta) / (2 * a);
				if(x > y) youli(-b + sqrt(delta), 2 * a);
				else youli(-b - sqrt(delta), 2 * a);
			}
			else {
				bool flag = false;
				if(1.0 * (-b) / (2 * a) != 0) { //-b/2a + sqrt(xxx)/2a中先处理-b/2a
					int gcd = __gcd(abs(a * 2), abs(-b)); //约分
					int q = a * 2 / gcd, p = -b / gcd;
					if(q < 0) q = -q, p = -p;
					youli(p, q);
					flag = true;
				}
				int k = huajian(delta);
				delta /= k * k; //sqrt(delta)/2a = k/2a * sqrt(delta/(k^2))
				double xi = fabs(1.0 * k / (2 * a));
				if(xi < 0) cout << '-';
				else cout << '+';
				wuli(xi, k, delta);
			}
		}
	}
	return 0;
}
2024/8/17 22:17
加载中...