[洛谷P1024]python一元三次方程求解

[洛谷P1024]python一元三次方程求解

首先将方程幂次形式转换为乘积形式(可节省代码运行时间)
其次使用零点定理 F ( x 1 ) ∗ F ( x 2 ) < 0 F({x}_1)*F({x}_2)<0 F(x1)F(x2)<0则必有一根,取 m = ( x 1 + x 2 ) / 2 m = ({x}_1+{x}_2)/2 m=(x1+x2)/2每次判断区间的一半内是否有根,也可以节约代码运行时间。
cnt 为计数器若收到三个根即可退出循环。
此题精度只需达到小数点两位即可 AC 故我们以小数点后三位为步长取值。

代码如下

n = input().split()  
cnt = 0
def func(x,n):
    a,b,c,d = eval(n[0]),eval(n[1]),eval(n[2]),eval(n[3])
    return (((a*x+b)*x)+c)*x+d
    
for i in range(-100,100):
    l = i
    r = i+1
    x1 = func(i,n)
    x2 = func(i+1,n)
    if x1 == 0:
        print("{:.2f}".format(l),end=" ")
        cnt += 1
    if x1*x2<0 :#大前提:左边和右边都不为0
        while (r-l) >= 0.001:#精度为两位小数故取三位小数可以夹逼至(l、r)最相近就可以近似的看作l==r;故只打印r
            m = (l+r)/2
            if func(m,n)*func(r,n) <= 0:
                l = m
            else:
                r = m
        print("{:.2f}".format(r),end=" ")
        cnt += 1
    if cnt == 3:
        break

你可能感兴趣的:(洛谷,python)