这道题其实是个 enormous(巨大的) 模拟,但是只需要按照题目给的要求来做就行了一步一步的慢慢做......
#include<bits/stdc++.h>
using namespace std;
int t,m,a,b,c;
int gcd(int p,int q)
{
int u;
while(q!=0)
{
u=p%q;
p=q;
q=u;
}
return p;
}
void work1(int p,int q)
{
if(p*q<0)
{
cout<<'-';
}
if(p<0)
{
p=0-p;
}
if(q<0)
{
q=0-q;
}
int g=gcd(p,q);//求出最大公约数
if(g==q)
{
cout<<p/g;
}
else
{
cout<<p/g<<'/'<<q/g;
}
return;
}
void work2(int p,int q)
{ //sqrt部分输出
if(p<0) p=-p;
if(q<0) q=-q;
int u=1;
for(int i=sqrt(p);i>=2;i--)
{
if(p%(i*i)==0)
{
p=p/(i*i);
u=u*i;
break;
}
}
int g=gcd(u,q);
u=u/g;
q=q/g;
if(u!=1)
{
cout<<u<<"*";
}
if(p!=1)
{
cout<<"sqrt("<<p<<")";
}
if(q!=1)
{
cout<<"/"<<q;
}
}
int main()
{
cin>>t>>m;
while(t--)
{
cin>>a>>b>>c;
int d=b*b-4*a*c;
if(d<0)
{//无解
cout<<"NO";
}
else
{ //有解
int q=sqrt(d);
if(q*q==d)
{ //x有理数
double ans1=1.0*(-b+q)/(2*a);
double ans2=1.0*(-b-q)/(2*a);
if(ans1>ans2)
{
if(-b+q==0)
{
cout<<0;
}
else
{
work1(-b+q,2*a);
}
}
else
{
if(-b-q==0)
{
cout<<0;
}
else
{
work1(-b-q,2*a);
}
}
}
else
{ //x无理数
if(b!=0)
{
work1(-b,2*a);
}
if(b!=0)
{
cout<<"+";
}
work2(d,2*a);
}
}
cout<<endl;
}
return 0;
}