一元二次方程的根
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