首先粗略的看一下题目
#include <bits/stdc++.h>
using namespace std;
int t,M,m,n;
long long sum;
void ch2(int rt)
{
//用穷举法找因数之中最大的一个完全平方数
m=1,n=rt;
sum=2;
for(;rt>1&&rt>=sum*sum;)
{
while(rt%(sum*sum)==0)
{
m *=sum;
rt/=sum*sum;
n/=sum*sum;
}
if(rt%sum==0)
{
rt/=sum;
sum--;
}
sum++;
}
}
void ch(int a,int b,int c,int rt){
int d=a*2;
//计算分母
int rt1=sqrt(rt);
//√▲ 如果是整数
bool fl=a>0?1:0;
//标记判断a的正负性
if(rt==rt1*rt1)
{//√▲ 若是一个整数,则式子形为整数或者分数形式
int u=fl?(-b)+rt1: (-b)-rt1;
//求出分子
int mo= __gcd(abs(u),abs(d));
//分子分母一起约分
u/=mo,d/=mo;
if(u*d<0)
{
printf("-");
//若结果为负数
}
u=abs(u);
d=abs(d);
if(u%d==0)//d是u的因数
{
printf("%d\n",u/d);
//结果为整数
}
else
{
printf("%d/%d\n",u,d);
//结果为分数
}
}
else
{
//√▲不是一个整数
//可能情况为 b*sqrt(c)或a+b*sqrt(c)
ch2(rt);
//计算根号的系数
int u1=(-b);
int d1=2*a;
//前半部分
int u2=fl?m: (-m);
int d2=2*a;
//后半部分
int mo1=__gcd(abs(u1),abs(d1));
int mo2=__gcd(abs(u2),abs(d2));
u1/=mo1,d1/=mo1;
if(u1*d1<0)
{
printf("-");
}
d1=abs(d1);
u1=abs(u1);
if(u1)
{
//特判分子等于 0的情况 ,分子不等于0才要输出前半部分
if(u1%d1==0)
{
printf("%d+",u1);
}
else
{
printf("%d/%d+",u1,d1);
}
}
u2/=mo2,d2/=mo2;
if(u2*d2<0)
{
printf("-");
}
u2=abs(u2),d2=abs(d2);
if(d2==1)
{//分子大于分母,且分子分母不互质
if(u2==1)
{
printf("sqrt(%d)\n",n);
}
//比如 a+sqrt(c)
else
{
printf("%d*sqrt(%d)\n",u2,n);
}//比如a+b*sqrt(c)
}
else if(u2==1)
{
// int mod3 = gcd(abs(u2), abs(d2));
printf("sqrt(%d)/%d\n",n,d2);
}
else
{
printf("%d*sqrt(%d)/%d\n",u2,n,d2);
}
}
return ;
}
signed main(){
scanf("%d%d",&t,&M);
while(t--)
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
int rt=b*b-4*a*c;
//计算根的判别
if(rt<0)
{
printf("NO\n");
}
else
{
ch(a,b,c,rt);
}
}
return 0;
}
可过。