代码如下
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
inline int gcd(int a,int b){ //最大公因数
if(a % b == 0)
{
return b;
}
return gcd(b,a % b);
}
inline void print(int a,int b){ // 按照规则输出有理数
if(a % b == 0)
{
printf("%d",a / b);
return;
}
else if(a == 0)
{
cout<<0;
return;
}
else
{
if(a * b < 0) //考虑是否输出负号
{
printf("-");
}
a = (a > 0 ? a : a * -1);
b = (b > 0 ? b : b * -1);
int temp = gcd(max(a,b),min(a,b));
a /= temp;
b /= temp;
printf("%d/%d",a,b);
}
return;
}
inline int solve_sqrt(int n){ //化为最简二次根式,n为将要被开方的数
for(register int i = sqrt(n) + 1;i >= 1;i -= 1)
{
if(n % (i * i) == 0)
{
return i;
}
}
return 1;
}
inline bool can_sqrt(int n){
for(register int i = 0;i * i <= n;i += 1)
{
if(i * i == n)
{
return true;
}
}
return false;
}
int main(){
int t,m;
cin>>t>>m;
for(int i = 0;i < t;i += 1)
{
int a,b,c,has_answer;
if(a < 0)
{
a *= -1;
b *= -1;
c *= -1;
}
scanf("%d %d %d",&a,&b,&c);
has_answer = b*b - 4*a*c;
if(has_answer < 0) //无解
{
printf("NO\n");
continue;
}
else if(can_sqrt(has_answer)) //解为有理数
{
print(0 - b + sqrt(has_answer),2*a);
cout<<endl;
continue;
}
else //解为无理数
{
int temp = solve_sqrt(has_answer); //temp > 0
has_answer /= (temp * temp); //化为最简二次根式
if(b != 0) //输出有理数部分,为0则不输出
{
print(0 - b,2*a);
cout<<'+';
}
a *= a < 0 ? -1 : 1; //要求输出最大解,则令分子分母同号
if(temp % (2 * a) == 0) //若无理数系数为整数
{
if(temp == (2 * a)) //若无理数系数为一则不输出系数
{
printf("sqrt(%d)\n",has_answer);
}
else
{
printf("%d*sqrt(%d)\n",temp / (2 * a),has_answer);
}
}
else //无理数系数为分数
{
int gcd_num = gcd(max(temp,2 * a),min(temp,2 * a));
if(temp / gcd_num == 1) //若化简后无理数系数分子为1则不输出分子
{
printf("sqrt(%d)/%d\n",has_answer,2 * a / gcd_num);
}
else
{
printf("%d*sqrt(%d)/%d\n",temp / gcd_num,has_answer,2 * a / gcd_num);
}
}
}
}
return 0;
}
总之求Hack数据啦qwq,有用必关谢谢喵~