求一元二次方程的根
描述:
利用公式x1 = (-b + sqrt(bb-4ac))/(2a), x2 = (-b -
sqrt(bb-4ac))/(2a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0。
输入:
输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数。
输出:
输出一行,表示方程的解。 若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=…。 若b2 > 4 * a *
c,则两个实根不等,则输出形式为:x1=…;x2 = …,其中x1>x2。 若b2 < 4 * a *
c,则有两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i,即x1的虚部系数大于等于x2的虚部系数,实部为0时不可省略。实部 =
-b / (2a), 虚部 = sqrt(4ac-bb) / (2*a) 所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。
样例输入:
样例输入1
1.0 2.0 8.0
样例输入21 0 1
样例输出:
样例输出1
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i
样例输出2
x1=0.00000+1.00000i;x2=0.00000-1.00000i
需要注意的点:
-
由于计算机有误差(表示浮点数的标准为ieee
754),判断两个小数相等最好不要用a==b的形式,应该用abs(a—b)<eps的形式,eps可以是一个很小的数,比如让eps=0.000001,总之,两个数的差足够小,就认为它们相等,具体足够小取多少,根据题目要求来定,一般取10的-6次方。 -
要避免输出—0.00000,通过判断进行输出。
-
如果一个数接近于0,则就认为它是0。
-
最开始要引用math库(实数)和cmath库(复数)。另外一种写法:from math import sqrt.
-
最后两行输出的格式,0是列表即format中的列表的第一个,输出实数和虚数部分,注意加号的位置。
-
拓展:带有不定参数的函数中的*arg和**kwarg,arg多余的参数转化为列表存储,kwarg多余的参数转化为字典存储。
实现代码:
import math
import cmath
a,b,c = eval(input().replace(' ',','))
delta = b*b - 4*a*c
if abs(delta) < 10**-6:
x1 = -b/(2*a)
if(abs(x1)<10**-6):
x1 = 0;
print("x1=x2={:.5f}".format(x1))
elif delta > 0:
x1 = (-b + math.sqrt(delta))/(2*a)
x2 = (-b - math.sqrt(delta))/(2*a)
print("x1={:.5f};x2={:.5f}".format(x1,x2))
else :
x1 = (-b + cmath.sqrt(delta))/(2*a)
x2 = (-b - cmath.sqrt(delta))/(2*a)
print("x1={0.real:.5f}{0.imag:+.5f}i;".format(x1),end = '')
print("x2={0.real:.5f}{0.imag:+.5f}i".format(x2))