求一元二次方程的根
描述:

利用公式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
样例输入2 1 0 1

样例输出:

样例输出1
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i
样例输出2
x1=0.00000+1.00000i;x2=0.00000-1.00000i

需要注意的点:

  1. 由于计算机有误差(表示浮点数的标准为ieee
    754),判断两个小数相等最好不要用a==b的形式,应该用abs(a—b)<eps的形式,eps可以是一个很小的数,比如让eps=0.000001,总之,两个数的差足够小,就认为它们相等,具体足够小取多少,根据题目要求来定,一般取10的-6次方。

  2. 要避免输出—0.00000,通过判断进行输出。

  3. 如果一个数接近于0,则就认为它是0。

  4. 最开始要引用math库(实数)和cmath库(复数)。另外一种写法:from math import sqrt.

  5. 最后两行输出的格式,0是列表即format中的列表的第一个,输出实数和虚数部分,注意加号的位置。

  6. 拓展:带有不定参数的函数中的*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))
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐