问题 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
答案不唯一,必定有更加优化的解法欢迎分享