一元二次方程的根


Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lld

Description

求一元二次方程的根。

 

Input

包含多组测试数据。

每组测试数据占一行,每行包含一元二次方程(ax2+bx+c=0)的三个系数a,b和c(均为double类型,a!=0)。

 

Output

如果有两个实根,则输出:x1=小的根,x2=大的根

如果是两相等实根,则输出:x1=x2=***

如果为复数,则输出:real=***,imag=***

均保留2位小数

 

Sample Input

1 3 2
1 -2 1
1 -2 5

 

Sample Output

x1=-2.00,x2=-1.00
x1=x2=1.00
real=1.00,imag=2.00

那么问题来了,复数根怎么求?经过我的一番学(bai)习(du),我找来了公式~

(手打公式真累啊,别看掉了那个 i )

那么我们就可以开始做题了……

一定不要忘记判断哪个根是小根,哪个是大根,因为不一定加了△ 会更大哦( a 为负的情况)


#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
    double a,b,c;
    double s1,s2,d,sd;
    while(scanf("%lf %lf %lf",&a,&b,&c)!=EOF)
    {
        if(a!=0)
        {
            d=(-4*a*c)+(b*b);//计算△
            if(d>=0)
            {
                sd=sqrt(d);//根△
                s1=(-b+sd)/(2*a);//求方程根
                s2=(-b-sd)/(2*a);
            }
            if(d<0)//无实数根
            {
                sd=sqrt(d*-1);
                s1=(-1*b)/(2*a);//实数部分
                s2=sd/(2*a);//虚数部分
                if(s2<0)
                    s2=-s2;
                printf("real=%.2lf,imag=%.2lf\n",s1,s2);
            }
            if(d==0)//相等根
                printf("x1=x2=%.2lf\n",s1);
            if(d>0)//有不同实根
                if(s1>s2)
                    printf("x1=%.2lf,x2=%.2lf\n",s2,s1);
                else
                    printf("x1=%.2lf,x2=%.2lf\n",s1,s2);
        }
    }
  return 0;
}

附加:

另一道题同解,更简单的:


一元二次方程是否有实根?


Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lld

Description

编写程序判断输入的一元二次方程是否存在实根。

 

Input

包含多组测试数据,每组测试数据输入占一行,每行包含3个整数a,b,c,它们代表一元二次方程ax2+bx+c=0。(a肯定不等于0)

 

Output

每组测试数据输出占一行,如果有实根则输出“yes”,否则输出“no”。

 

Sample Input

1 -2 3
1 -2 -3

 

Sample Output

no
yes