求助(题解)
  • 板块灌水区
  • 楼主baoxuanming
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/7/11 13:37
  • 上次更新2023/11/4 15:05:41
查看原帖
求助(题解)
394886
baoxuanming楼主2021/7/11 13:37

题目传送门:B2053


铺垫

1.什么是一元二次方程?

只含有一个未知数(一元),并且未知数项的最高次数是2(二次)的整式方程叫做一元二次方程。一元二次方程经过整理都可化成一般形式ax²+bx+c=0(a≠0)。其中 ax2ax² 叫作二次项,aa 是二次项系数;bxbx 叫作一次项,bb 是一次项系数;cc 叫作常数项(以上内容来自百度百科)

注:一元二次方程有两个根!(但可能两个重合或有虚根)

2.一元二次方程的判别式 Δ\Delta

对于一个一元二次方程 ax2+bx+cax^2+bx+c ,有判别式 Δ=b24ac\Delta=\sqrt{b^2-4ac}

Δ<0\Delta<0,此方程无实数根;

Δ=0\Delta=0,此方程两个实数根一样;

Δ>0\Delta>0,此方程有两个不同的实数根。

思路

首先,算出 Δ\Delta,靠 Δ\Delta 判断是否有根。

之后,用求根公式算出 x1x_1x2x_2

再判断:

如果 Δ=0\Delta=0,输出 x1x1

否则先输出 x2x_2 再输出 x1x_1(由于平方根的非负性,x2>x1x_2>x_1)。

TIPS

在 c++ 中,判断两个精度高的浮点数,一般差距小于一个很小的数(如10810^{-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");
	}
} 

(排版不正确)

2021/7/11 13:37
加载中...