1058:求一元二次方程(一元二次方程求根公式推导和运用)

推导

一元二次方程:只有一个未知数,且未知数的最高次数为2

一元二次方程的一般形式:

$ax^{2} +bx+c =0$

$a\ne 0$

两边同时除以a      $x^{2} +\frac{b}{a} x+\frac{c}{a} =0$

配方                   $x^{2} +2\times \frac{b}{2a} x+\left (\frac{b}{2a} \right ) ^{2} +\frac{c}{a} -\left ( \frac{b}{2a} \right )^{2}=0 $

整理                   $\left ( x+\frac{b}{2a} \right ) ^{2}=\frac{b^{2}}{4a^{2}} -\frac{c}{a} $

                         $\left ( x+\frac{b}{2a} \right ) ^{2}=\frac{b^{2}-4ac}{4a^{2}}$

开平方整理          $x=\frac{-b\pm \sqrt[]{ b^{2}-4ac}}{4a}$(正数负数的平方都为正)

题目


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 145752     通过数: 30749

【题目描述】

利用公式$x_1 = \frac{-b + \sqrt{b^2-4ac}}{2a},x_2 = \frac{-b - \sqrt{b^2-4ac}}{2a}$,求一元二次方程$ax^2+ bx + c =0$的根,其中$a$不等于$0$。结果要求精确到小数点后$5$位。

【输入】

输入一行,包含三个浮点数$a, b, c$(它们之间以一个空格分开),分别表示方程$ax^2 + bx + c =0$的系数。

【输出】

输出一行,表示方程的解。

若两个实根相等,则输出形式为:“$x_1=x_2=...$”;

若两个实根不等,在满足根小者在前的原则,则输出形式为:“$x_1=...;x_2 = ...$“;

若无实根输出“No answer!”。

所有输出部分要求精确到小数点后5位,数字、符号之间没有空格。")

【输入样例】
-15.97 19.69 12.02
【输出样例】
x1=-0.44781;x2=1.68075

所有输出部分要求精确到小数点后5位,数字、符号之间没有空格。 【输入样例】 -15.97 19.69 12.02 【输出样例】 x1=-0.44781;x2=1.68075

解题思路、难点

本题主要根据derta($ b^{2}-4ac$)>=<0的情况分类,derta($ b^{2}-4ac$)=0这种情况应用精度问题解决derta($ b^{2}-4ac$)<1e-9,其中输入数据应用double类型容易被忽略,用float测试点6不能通过.

查看代码
 #include<iostream>
#include<cmath>
int main(){
	double a,b,c,x1,x2;//用浮点数会溢出
	scanf("%lf %lf %lf",&a,&b,&c);
if((b*b-4*a*c) &lt;0){

	printf("No answer!");
}
else{
	x1=(-b+sqrt(b*b-4*a*c))/(2*a);
	x2=(-b-sqrt(b*b-4*a*c))/(2*a);
	if(fabs(b*b-4*a*c)&lt;1e-6){
		printf("x1=x2=%.5lf",x1);
	}
	else if(x1&gt;x2){
		printf("x1=%.5f;x2=%.5lf",x2,x1);	
	}
	else {
		printf("x1=%.5f;x2=%.5lf",x1,x2);
	}
}
return 0;

}

posted @ 2023-11-02 10:57  源谋人  阅读(392)  评论(0)    收藏  举报