极简题解
2025-08-06 19:16:50
发布于:上海
13阅读
0回复
0点赞
大模拟
题目大意
给出一元二次方程ax^2+bx+c=0(a≠0)的3个系数,求解这个一元二次方程,以题目要求的形式表示根号与分式(详见题目与样例),输出较大的根
思路分析
从跟的判别式(b^2 - 4ac)入手,模拟一元二次方程的解法,并按要求输出结果,必须每种情况都考虑到,否则会因多组样例爆零
我第一次做写了个124行的代码结果爆零
代码实现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll t,m;
void change(ll &x,ll &y){ //change将两数化为互素,负号放前数
if(x == 0){
y = 1;
return ;
}
ll g = __gcd(x,y); //两数最大公因数
x /= g;
y /= g;
if(y < 0){ //将符号换到前项
x = -x;
y = -y;
}
return ;
}
void solve(){
ll a,b,c;
cin >> a >> b >> c;
ll d = b * b - 4 * a * c;
if(d < 0){
//原方程无解
cout << "NO" << endl;
return ;
}
if(d == 0){
//d = 0,只看-b / 2*a
ll p = -b;
ll q = 2 * a;
change(p,q);
if(q == 1) cout << p << endl;
else cout << p << "/" << q << endl;
return ;
}
//d > 0
ll k = 1,t = d;
//d = k * k * r
//如果r == 1,sqrt(d) == k
//如果r != 1,sqrt(d) == k * sqrt(r)
for(int i = 2;i * i <= t;i++){
while(t % (i * i) == 0){
t /= (i * i);
k *= i;
}
}
//通过d(t)中相同的因数算出k
ll r = t;
if(r == 1){
//sqrt(d)能开方
ll p = (a > 0) ? (-b + k) : (-b - k);
ll q = 2 * a;
//如果a > 0则-b + k加法得的结果最大
//如果a < 0则-b - k减法得的结果最大
change(p,q);
//两者化为互素
if(q == 1) cout << p << endl;
//q == 1时去分母
else cout << p << "/" << q << endl;
}else{
ll p1 = -b;
ll q1 = 2 * a;
change(p1,q1);
//处理根号前的结果
ll s = (a > 0) ? 1 : -1;
//同上,得到最大值
ll p2 = s * k;
ll q2 = 2 * a;
change(p2,q2);
//处理根号项的结果
if(p1 != 0){
//根号前不为0则输出前项
if(q1 == 1) cout << p1;
else cout << p1 << "/" << q1;
cout << "+";
}
if(p2 == 1 && q2 == 1){
cout << "sqrt(" << r << ")";
//系数都为1,只输出根号
}else if(q2 == 1){
cout << p2 << "*sqrt(" << r << ")";
//分母为1,只输出分子
}else if(p2 == 1){
cout << "sqrt(" << r << ")/" << q2;
//分子系数为1
}else{
cout << p2 << "*sqrt(" << r << ")/" << q2;
//一般情况
}
cout << endl;
}
}
int main(){
freopen("uqe.in","r",stdin);
freopen("uqe.out","w",stdout);
cin >> t >> m;
while(t--){
solve();
}
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也
有帮助,赞一个