题目传送门:B2053
只含有一个未知数(一元),并且未知数项的最高次数是2(二次)的整式方程叫做一元二次方程。一元二次方程经过整理都可化成一般形式ax²+bx+c=0(a≠0)。其中 ax2 叫作二次项,a 是二次项系数;bx 叫作一次项,b 是一次项系数;c 叫作常数项(以上内容来自百度百科)
注:一元二次方程有两个根!(但可能两个重合或有虚根)
对于一个一元二次方程 ax2+bx+c ,有判别式 Δ=b2−4ac 。
当 Δ<0,此方程无实数根;
当 Δ=0,此方程两个实数根一样;
当 Δ>0,此方程有两个不同的实数根。
首先,算出 Δ,靠 Δ 判断是否有根。
之后,用求根公式算出 x1 和 x2。
再判断:
如果 Δ=0,输出 x1。
否则先输出 x2 再输出 x1(由于平方根的非负性,x2>x1)。
在 c++ 中,判断两个精度高的浮点数,一般差距小于一个很小的数(如10−8),就当作这两个数一样。
Code:
#include<bits/stdc++.h>
#include<math.h>
using namespace std;
#define eps 1e-8//很小的数
int main()
{
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);
double a1=b*b;
double b1=4*a*c;
double c1=a1-b1;
if(fabs(c1)<eps)//必须加绝对值
{
double x=(-b+sqrt(c1))/(2*a);
printf("x1=x2=%.5lf\n", x);
}
else if(c1>eps)
{
double x1=(-b-sqrt(c1))/(2*a);
double x2=(-b+sqrt(c1))/(2*a);
if(x1 > x2) swap(x1, x2);//先小再大输出
printf("x1=%.5lf;x2=%.5lf\n",x1,x2);
}
else
{
printf("No answer!\n");
}
}
(排版不正确)