Python(分治算法)问题 C: 一元三次方程求解_有形如:ax3+bx2+cx+d=0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范

问题 C: 一元三次方程求解

题目描述

有形如:ax3+bx2+cx+d=0这样的一个一元三次方程。
给出该方程中各项的系数(a,b,c,d均为实数),
并约定该方程存在三个不同实根(根的范围在-100至100之间),
且根与根之差的绝对值≥1。

要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),
并精确到小数点后2位。    

提示:
记方程f(x)=0,
若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,
则在(x1,x2)之间一定有一个根。

输入

a,b,c,d

输出

三个实根(根与根之间留有空格)

样例输入

1 -5 -4 20

样例输出

-2.00 2.00 5.00

解答(分治算法):

n1 = input().split()  # 读取数据
sum1 = 0  # 初始化sum1,用于记录解的个数


def func(x, n):
    a, b, c, d = eval(n[0]), eval(n[1]), eval(n[2]), eval(n[3])
    return a * x ** 3 + b * x ** 2 + c * x + d


for i in range(-100, 101):  # 从-100开始每隔1取一个数
    left = i
    right = i + 1
    x1 = func(left, n1)  # 调用函数
    x2 = func(right, n1)
    if x1 == 0:
        # 如果等于零就正好是解,直接输出
        print("{:.2f}".format(left), end=" ")
        sum1 += 1
    if x1 * x2 < 0:
        # 如果两数的积小于0则说明这个区间存在至少一个解
        while (right - left) >= 0.001:
            m = (left + right) / 2
            # 因为题目给出根与根之间的距离大于等于1
            # 故使用该方法缩小搜索范围
            if func(m, n1) * func(right, n1) <= 0:
                left = m
            else:
                right = m
        print("{:.2f}".format(right), end=" ")
        sum1 += 1
    if sum1 == 3:
        break

答案不唯一,必定有更加优化的解法欢迎分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值