题目地址:一元三次方程求解
看着这个题不要被吓到,这只是披着狼皮的二分罢了,注意题目中所说的实根,是包括小数的,而且由题意不过小数点后两位,而且根范围为(-100 ,100),不是特别大,所以我们可以对内两个两个的划分区间,若齐相乘< 0,则代表答案在他俩之间,若相乘== 0,则代表答案在最左边(因为我们是对整数范围而且相差为1进行判断,若答案在最右边则下一次移动时,最右边的答案会变为最左边的)。
先上二分模板:
def check(mid):
if 符合条件:
return True
return False
left = 1
right = 10000
while left <= right: # 也可以为'<',有的题目若为'<='则会陷入无限循环,此道题就是
mid = (left + right) // 2
if check(mid): # return 1则代表此值可以用,但是可能小于答案,故向右搜索
left = mid + 1
else: # return 0则代表此值不可以用,此数比答案大,故向左搜索
right = mid
先对模板进行补充:
def func(x):
return a * x*x*x + b * x*x + c * x + d
left = -100
right = left + 1
while right - left >= 0.001:
mid = (right + left) / 2 # 注意不要为整除,因为答案存在小数
if func(mid) * func(right) <= 0:
left = mid
else:
right = mid
left += 1
right = left += 1
在进行录入数据(注意要开浮点型,否则有段错误!):
a, b, c, d = map(float, input().split())
完整AC代码:
a, b, c, d = map(float, input().split()) # 注意要开浮点型,否则有段错误
def func(x):
return a * x*x*x + b * x*x + c * x + d
for i in range(-100, 100): # 数据不多,可以两个两个区间进行判断
left = i
right = left + 1
fx1 = func(left)
fx2 = func(right)
if fx1 == 0:
print("{:.2f}".format(left), end=' ')
if (fx1 * fx2) < 0: # 代表区间内存在解
while right - left >= 0.001:
mid = (right + left) / 2
if func(mid) * func(right) <= 0:
left = mid
else:
right = mid
print("{:.2f}".format(left), end=' ')