题解
2025-08-08 11:18:43
发布于:上海
10阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
void tosimp(int &p,int &q){//化简
if(p==0){
q=1;
return;
}
int g=gcd(abs(p),abs(q));//找最大公因数
p/=g,q/=g;
if(q<0){//保证负号在分子上
p=-p;
q=-q;
}
}
void solve(){
int a,b,c;
cin>>a>>b>>c;
int d=b*b-4*a*c;
if(d<0){//无解
cout<<"NO\n";
return ;
}
if(d==0){//只有一个解
int p=-b;//&p
int q=2*a;//&q
tosimp(p,q);
//p/q q==1
if(q==1) cout<<p<<endl;
else cout<<p<<"/"<<q<<endl;
return;
}
int k=1,t=d; //sqrt(d)=k*sqrt(r)
// d=k*k*r
for(int i=2;i*i<=t;i++){
while(t%(i*i)==0){//找到一个能整除的平方数
//d尽可能地把平方数整除尽
//t每次除平方数i*i,k每次乘i,最后k就是能开尽的平方数
t/=i*i,k*=i;
}
//d=t=4*4*9*3->2*2*3*sqrt(3)
}
int r=t;
if(r==1){//x解是有理数
//用a的±去找最大实数解
int p=(a>0)?(-b+k):(-b-k);
int q=2*a;
tosimp(p,q);
if(q==1) cout<<p<<endl;
else cout<<p<<"/"<<q<<endl;
}else{//x解是无理数->划分为p1/q1+p2*sqrt(r)/q2;
//x=-b/(2*a) ± k/(2*a)*sqrt(r)
//a>0 -b/(2*a) + k/(2*a)*sqrt(r)
//a<0 -b/(2*a) - k/(2*a)*sqrt(r)
int p1=-b;
int q1=2*a;
tosimp(p1,q1);
int s=(a>0)?1:-1;//处理正负号
int p2=s*k;
int q2=2*a;
tosimp(p2,q2);
if(p1!=0){
if(q1==1) cout<<p1;
else cout<<p1<<"/"<<q1;
cout<<"+";
}
if(p2==1&&q2==1) cout<<"sqrt("<<r<<")";//sqrt(r)
else if(q2==1) cout<<p2<<"*sqrt("<<r<<")";//p2*sqrt(r)
else if(p2==1) cout<<"sqrt("<<r<<")/"<<q2;//sqrt(r)/q2
else cout<<p2<<"*sqrt("<<r<<")/"<<q2;//p2*sqrt(r)/q2
cout<<endl;
}
}
int main(){
freopen("uqe.in","r",stdin);
freopen("uqe.out","w",stdout);
int t,m;
cin>>t>>m;
while(t--){
solve();
}
fclose(stdin);
fclose(stdout);//王老师同款代码
return 0;
}
这里空空如也
有帮助,赞一个