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) <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)<1e-6){ printf("x1=x2=%.5lf",x1); } else if(x1>x2){ printf("x1=%.5f;x2=%.5lf",x2,x1); } else { printf("x1=%.5f;x2=%.5lf",x1,x2); } } return 0;
}
浙公网安备 33010602011771号