0
点赞
收藏
分享

微信扫一扫

python实现一元三次方程求根-二分法


今天我的一位学妹拿了一道编程题来问我,我当时没时间,然后她找了答案,叫我帮忙运行验证一下,我当时做了一些修改,觉得实现过程还不错,所以记录一下,分享出来学习学习。

题目:有形如这样一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100到100之间),且根与根之差的绝对值大于等于1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

提示:记方程,若存在2个实数,且,,则在之间一定有一个根。

输入格式

一行,4个实数a,b,c,d

输出格式

一行,3个实根,从小到大输出,并精确到小数点后2位。
输入:

1 -5 -4 20

输出:

-2.00 2.00 5.00

代码实现

本质上就是从-100开始,一个一个的尝试,尝试的方法是使用二分法,直到找到3个满足条件的根就可以终止了。知道了这个就可以尝试写出代码:

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

def solve(numbers):
cnt=0
for i in range(-100,100):
l=i
r=i+1
x1=func(i,numbers)
x2=func(i+1,numbers)
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,numbers)*func(r,numbers)<=0:
l=m
else:
r=m
print("{:.2f}".format(r),end=" ")
cnt+=1
if cnt == 3:
break

if __name__=="__main__":
numbers=input().split()
# numbers = '1 -5 -4 20'.split()
solve(numbers)

参考文献

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


举报

相关推荐

0 条评论