这是一个连T1都没AC的蒟蒻.
纯纯的模拟题,按题目描述写代码即可,打的手酸死了,连我这个初二数学渣都会做一元二次方程了().
按题目描述,本文分为以下几部分:
输入 T T T和 M M M, T T T代表数据数量,而 M M M没有啥用,几乎可以忽略,但是必须得输入.
每组数据输入 a 、 b 、 c a、b、c a、b、c,代表方程的系数.
有理数的输出
题目中许多有理数应按格式输出,因此有一个输出模板会比较方便,为了下文代码简洁,这里便定义一个函数做模板. 函数有两个参数,分别代表分子p和分母q. 由于满足 q > 0 q > 0 q>0,分数又可以为负数,所以约分时需要将p进行绝对值判断. 约分过程较为简单,就是若最大公因数不为 0 0 0,将 p 、 q p、q p、q分别除以最大公因数即可.
void rational(long long p,long long q)
{
long long gcd=__gcd(abs(p),q); //获取最大公因数
while(gcd!=1) //若两数未互质
{
p/=gcd;
q/=gcd;
gcd=__gcd(abs(p),q); //不断获取最大公因数
}
printf("%lld",p);
if(q!=1) //若分母为1即为整数,不输出分母
printf("/%lld",q);
return;
}
无实数解
题目告诉我们:若 Δ = b 2 − 4 a c < 0 \Delta = b ^ 2 - 4ac < 0 Δ=b2−4ac<0,则表明方程无实数解,此时你应当输出 NO \text{NO} NO. 所以我们定义一个变量 D e l t a Delta Delta赋值为 Δ \Delta Δ (后面会有很多要用的). 若 D e l t a < 0 Delta<0 Delta<0 ,我们输出 NO \text{NO} NO,进入下一轮判断.
Delta=b*b-4*a*c;
if(Delta<0)
{
printf("NO\n");
continue;
}
有实数解
当 Δ ≥ 0 \Delta≥0 Δ≥0,此时方程有两解(可能相等),记其中较大者为 x x x.
当 x x x为有理数
判断整数 Δ \Delta Δ是否为有理数,即求 int( Δ \sqrt \Delta Δ) 2 ^2 2是否等于 Δ \Delta Δ. 若相等则代表 Δ \Delta Δ为有理数.
根据公式 x = − b ± Δ 2 a = − b 2 a ± Δ 2 a x=\frac{-b \pm \sqrt \Delta}{2a}=\frac{-b}{2a} \pm \frac{\sqrt \Delta}{2a} x=2a−b±Δ=2a−b±2aΔ,a、b为定值,即 − b 2 a \frac{-b}{2a} 2a−b和 Δ 2 a \frac{\sqrt \Delta}{2a} 2aΔ是定值,那么 x x x的值由符号 ± \pm ± 决定. 因为 Δ ≥ 0 \sqrt \Delta\ge0 Δ≥0,所以我们可以知道当 a > 0 a>0 a>