天天看点

分支-18. 求一元二次方程的根(20)

本题目要求一元二次方程 a*x2+b*x+c=0 的根,结果保留2位小数。

输入格式:

输入在一行中给出3个浮点系数a, b, c,中间用空格分开。

输出格式:

根据系数情况,输出不同结果:

1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;

2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;

3)如果方程只有一个根,则直接输出此根;

4)如果系数都为0,则输出”Zero Equation”;

5)如果a和b为0,c不为0,则输出”Not An Equation”。

输入样例 1:

2.1 8.9 3.5

输出样例 1:

-0.44

-3.80

输入样例 2:

1 2 3

输出样例 2:

-1.00+1.41i

-1.00-1.41i

输入样例 3:

0 2 4

输出样例 3:

-2.00

输入样例 4:

0 0 0

输出样例 4:

Zero Equation

输入样例 5:

0 0 1

输出样例 5:

Not An Equation

#include<stdio.h>  
#include <math.h>
int main()  
{ 
    double a,b,c,d,s,x;//无实根情况下,s表示实数部分,x表示虚数部分
    scanf("%lf %lf %lf",&a,&b,&c);
    d = b*b-*a*c; //判别式,根据d判断有几个解
    if (a==&&b==&&c==)
        printf("Zero Equation");
    else if (a==&&b==&&c!=)
        printf("Not An Equation");
    else if (a==&&b!=&&c!=)//此时为一次方程,一个解
        printf("%.2f",-(c/b));
    else if (d==)//两个相同解
        printf("%.2f",(-b+sqrt(d))/(*a));
    else if (d>)//两个不同实数解
        printf("%.2f\n%.2f",(-b+sqrt(d))/(*a),(-b-sqrt(d))/(*a));
    else//两个虚数解
    {
        s = -b/(*a);
        x = sqrt(-d)/(*a);
        s = s==?:s;//实数部分为,则表示为.
        printf("%.2f+%.2fi\n%.2f-%.2fi",s,x,s,x);
    }

    return ;  
}  

           

提交4次第六个测试点始终不过,测试点6:实部为0时输出0.00+xi 因此要注意最后无实根情况下,判断实数部分为0的表示问题。

但在s=0时,为什么直接printf(“%.2f+%.2fi\n%.2f-%.2fi”,s,x,s,x);会出错呢???为什么添加s = s==0?0:s;后就通过,两者有何差别?