以下代码平铺直叙,如果你嫌判断a的正负号太麻烦的话,
可以先将a变为非负数,即 if(a<0) { a*=-1; b*=-1; c*=-1; }
程序代码:
#include <stdio.h>
#include <math.h>
int main( void )
{
double a, b, c;
if( scanf("%lf%lf%lf",&a,&b,&c) != 3 )
puts( "Input error" );
else if( a==0 && b==0 && c==0 ) // 4)如果系数都为0,则输出"Zero Equation"
puts( "Zero Equation" );
else if( a==0 && b==0 ) // 5)如果a和b为0,c不为0,则输出"Not An Equation"
puts( "Not An Equation" );
else if( a==0 ) // 3)如果方程只有一个根,则直接输出此根
printf( "%.2f\n", -c/b );
else
{
double delta = b*b - 4*a*c;
if( delta>0 && a>0 ) // 1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
printf( "%.2f %.2f\n", (-b+sqrt(delta))/(2*a), (-b-sqrt(delta))/(2*a) );
else if( delta>0 && a<0 ) // 1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
printf( "%.2f %.2f\n", (-b-sqrt(delta))/(2*a), (-b+sqrt(delta))/(2*a) );
else if( delta<0 && a>0 ) // 2)如果方程有两个不相等复数根,则每行按照格式"实部+虚部i"输出一个根,先输出虚部为正的,后输出虚部为负的;
printf( "%.2f+%.2fi %.2f-%.2fi\n", -b/(2*a), sqrt(-delta)/(2*a), -b/(2*a), sqrt(-delta)/(2*a) );
else if (delta < 0 && a<0) // 2)如果方程有两个不相等复数根,则每行按照格式"实部+虚部i"输出一个根,先输出虚部为正的,后输出虚部为负的;
printf( "%.2f+%.2fi %.2f-%.2fi\n", -b/(2*a), -sqrt(-delta)/(2*a), -b/(2*a), -sqrt(-delta)/(2*a) );
else // 3)如果方程只有一个根,则直接输出此根
printf( "%.2f\n", -b/(2*a) );
}
}
输入
0 0 0
0 0 1
0 2 6
1 1 -2
-1 -1 2
1 2 2
-1 -2 -2
1 -2 1
输出
Zero Equation
Not An Equation
-3.00
1.00 -2.00
1.00 -2.00
-1.00+1.00i -1.00-1.00i
-1.00+1.00i -1.00-1.00i
1.00