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

题面

直接依照题意模拟即可,注意细节。

细节

第一

注意输出分式时分母为 1 不输出,分子为 0 直接输出零且不带正负号。

第二

约分时,gcd 内的两个数应该都是非负实数。

第三

可以单独输出符号,注意别有多余的符号。

第四

当方程有两根且均是有理数时,要根据 2a 的正负来判断哪个根最大:当 2a>0 时,最大的根为 b+Δ2a,否则应该是 bΔ2a

第五

注意一下自己的符号有没有打对!!!!无理数部分符号打错了还能有七十分真是奇迹

第六

全输出 NO 一分没有(不要想着水分)。

代码

#include<bits/stdc++.h>
#define ll long long
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
using namespace std;
inline ll gcd(ll a , ll b)
{
	return b == 0 ? a : gcd(b , a % b);
}
inline ll derta(ll a , ll b , ll c)
{
	return b * b - 4 * a * c;
}
ll T , M , a , b , c;
signed main()
{
//	freopen("data.in" , "r" , stdin);
//	freopen("data.out" , "w" , stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> T >> M;
	while(T--)
	{
		cin >> a >> b >> c;
		if(derta(a , b , c) < 0)//判别式小于零,无解 
		{
			cout << "NO" << '\n';
			continue;
		}
		else if(derta(a , b , c) == 0)//两个有理数根 
		{
			if(b == 0)
			{
				cout << 0 << '\n';
				continue;
			}
			else
			{
				ll ccf = gcd(abs(2 * a) , (abs(-b)));
				if(-b * a < 0)
				{
					cout << "-";
				}
				cout << abs(-b) / ccf;
				if(abs(2 * a) / ccf != 1)
				{
					cout << "/" << abs(2 * a) / ccf << '\n';
				}
				else
				{
					cout << '\n';
				}
			}
		}
		else
		{
			//x1 = (-b - sqrt(derta(a , b , c))) / (2 * a);
			//x2 = (-b + sqrt(derta(a , b , c))) / (2 * a);
			ll dt = derta(a , b , c);
			ll ccf = gcd(abs(a) , abs(b));
			double sqdt = sqrt(dt);
			if(sqdt - (ll)sqrt(dt) == 0.0)//有理数 
			{
				dt = sqrt(dt);
				ll flag;
				if(2 * a > 0)
				{
					flag = 1;
				}
				else
				{
					flag = -1;
				}
				ccf = gcd(abs(-b + dt * flag) , abs(2 * a));
				if((-b + dt * flag) * a < 0)
				{
					cout << "-";
				}
				cout << abs(-b + dt * flag) / ccf;
				if(abs(2 * a) / ccf != 1)
				{
					cout << "/" << abs(2 * a) / ccf << '\n';
				}
				else
				{
					cout << '\n';
				}
			}
			else//无理数 
			{
				//有理数部分
				ccf = gcd(abs(-b) , abs(2 * a));
				if(b != 0)
				{
					if(-b * a < 0)
					{
						cout << "-";
					}
					cout << abs(-b) / ccf;
					if(abs(2 * a) / ccf != 1)
					{
						cout << "/" << abs(2 * a) / ccf;
					}
				}
				//无理数部分
				ll cf = dt , w_fz = dt , q2 = 1;
				fo(i , sqrt(M * M * 4) , 1)
				{
					if(cf % (i * i) == 0)
					{
						cf /= i * i;
						w_fz /= i * i;
						q2 = i;
						break;
					}
				}
				ccf = gcd(q2 , abs(2 * a));
				if(a < 0 && b != 0)
				{
					cout << "+";
				}
				else
				{
					if(b != 0 && q2 != 0)
					{
						cout << "+";
					}
				}
				if(q2 / ccf != 1)
				{
					cout << q2 / ccf << "*";
				}
				if(w_fz != 1)
				{
					cout << "sqrt(" << w_fz << ")";
				}
				if(abs(2 * a) / ccf != 1)
				{
					cout << "/" << abs(2 * a) / ccf << '\n';
				}
				else
				{
					cout << '\n';
				}
			}
		}
	}
 	return 0;
}
posted @   心海秋的墨木仄  阅读(303)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示