题目描述
一元二次方程的标准形式为ax2+bx+c=0(a≠0),其中a、b、c为常数。求解一元二次方程的根x时有三种情况,分别为(记Δ=b2-4ac):
- Δ>0,有两个不等的实根;
- Δ=0,有两个相同的实根;
- Δ<0,有两个共轭的虚根。
输入
输入为多行,每行为一元二次方程的三个常数a,b,c,在double类型范围之内。当输入的a为0时,表示输入结束。
输出
每行输入的样例对应三行输出。
第一行输出为样例的编号。
第二行输出为所输入常数a,b,c对应的一元二次方程的标准形式,要求输出满足a>0。
第三行输出为所输入方程的根,分为三种情况:
-
若方程满足Δ>0,即有两不等实根x1、x2,则按顺序(先小后大)输出这两个实根。
-
若方程满足Δ=0,即有两相同实根x,则输出一个实根。
-
若方程满足Δ<0,即有两共轭的虚根x1、x2,则输出两个虚根,虚部符号为正的(即u+vi形式)先输出,虚部符号为负的(x-yi形式)后输出。
以上输出均不输出数学上无意义或可省略的的符号,所有数值最多保留6位有效数字。每个样例之后都有一个空行分隔。
样例输入
1 2 1
-1 2 -1
-5 2 -0.2
-3 2 0
3 0 12
2 4 4
0
样例输出
Case 1 :
x^2 + 2x + 1 = 0
only one real root : -1
Case 2 :
x^2 - 2x + 1 = 0
only one real root : 1
Case 3 :
5x^2 - 2x + 0.2 = 0
only one real root : 0.2
Case 4 :
3x^2 - 2x = 0
two real roots : 0, 0.666667
Case 5 :
3x^2 + 12 = 0
two imaginary roots : 2i, -2i
Case 6 :
2x^2 + 4x + 4 = 0
two imaginary roots : -1+i, -1-i
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,d,m,x1,x2,t,s;
int i=1;
while(scanf("%lf",&a)&&a!=0)
{
if(a==0) break;
if(a!=0)
{
scanf("%lf%lf",&b,&c);
if(a<0)
{a=-a;b=-b;c=-c;}
printf("Case %d :\n",i);
i++;
if(a==1)
printf("x^2 ");
else
printf("%gx^2 ",a);
if(b==0) ;
else if(b==1)
printf("+ x ");
else if(b==-1)
printf("- x ");
else
printf("%c %gx ",b>0?'+':'-',fabs(b));
if(c==0);
else
printf("%c %g ",c>0?'+':'-',fabs(c));
printf("= 0\n");
m=b*b-4*a*c;
d=sqrt(m);
if(m>1e-12)
{
x1=(-b-d)/(2*a);
x2=(-b+d)/(2*a);
if(fabs(x1)<1e-6) x1=0;
if(fabs(x2)<1e-6) x2=0;
printf("two real roots : %g, %g\n",x1,x2);
}
else if(fabs(m)<1e-12)
{
x1=-b/(2*a);
if(fabs(x1)<1e-6) x1=0;
printf("only one real root : ");
if(x1==0) printf("0\n");
else
printf("%g\n",x1);
}
else
{
t=(-b)/(2*a);
s=sqrt(4*a*c-b*b)/(2*a);
if(fabs(t)<1e-6) t=0;
if(fabs(s)<1e-6) s=0;
printf("two imaginary roots : ");
if(t==0) ;
else
printf("%g",t);
if(t==0)
{
if(s==1) printf("i");
else printf("%gi",s);
}
else
{
if(s==1) printf("+i");
else printf("+%gi",s);
}
printf(", ");
if(t!=0)
printf("%g",t);
if(s!=1)
printf("-%gi\n",s);
else
printf("-i\n");
}
printf("\n");
}
}
return 0;
}