问题描述
假设有形如:ax2+bx+c=0的一元二次方程,其中a,b,c是任意实数且满足a≠0,请编写一段程序,根据用户输入的a,b,c的值,计算并输出一元二次方程的根。
输入
三个用空格分开的实数,分别表示一元二次方程中的三个系数。 输入数据保证满足条件a≠0。
输出
输出只有一行,即方程的根。 若方程有两个相同的实根,则输出:x1=x2=...; 若方程有两个不相同的实根,则输出:x1=...;x2=...,其中x1>x2; 若方程没有实根,则输出:x1=实部+虚部i;x2=实部-虚部i,其中,实部为0时不能省略,并且必须保证x1的虚部为非负数。 所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。
输入示例
1.0 2.0 8.0
输出示例
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i
我们要考虑方程根的情况,分为三种∆>0,∆<0,∆=0.
1.∆>0
有两个不相等的实根
2.∆<0
两个的复数根。
3.∆=0
有两个相等的实根。
#include<stdio.h>
#include<math.h>
int main(void)
{
double a,b,c;
scanf("%lf %lf %lf",&a,&b,&c);
if(b*b-4*a*c==0)
{
printf("x1=x2=%.5lf",-b/(2*a));
}
if(b*b-4*a*c>0)
{
if((-b+sqrt(fabs(b*b-4*a*c)))/(2*a)>(-b-sqrt(fabs(b*b-4*a*c)))/(2*a))
printf("x1=%.5lf;x2=%.5lf",(-b+sqrt(fabs(b*b-4*a*c)))/(2*a),(-b-sqrt(fabs(b*b-4*a*c)))/(2*a));
if((-b+sqrt(fabs(b*b-4*a*c)))/(2*a)<=(-b-sqrt(fabs(b*b-4*a*c)))/(2*a))
printf("x1=%.5lf;x2=%.5lf",(-b-sqrt(fabs(b*b-4*a*c)))/(2*a),(-b+sqrt(fabs(b*b-4*a*c)))/(2*a));
}
if(b*b-4*a*c<0)
{
if(b==0)
{
printf("x1=0.00000+%.5lfi;x2=0.00000-%.5lfi",sqrt(4*a*c-b*b)/fabs(2*a),sqrt(4*a*c-b*b)/fabs(2*a));
}
else
{
printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi",-b/(2*a),sqrt(4*a*c-b*b)/fabs(2*a),-b/(2*a),sqrt(4*a*c-b*b)/fabs(2*a));
}
return 0;
}
}