小代码
2026-08-18 10:24:12
发布于:浙江
#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 f(){
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 ;
}
ll k = 1,t = d; //d > 0
//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;
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--){
f();
}
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也



















有帮助,赞一个