今天我的一位学妹拿了一道编程题来问我,我当时没时间,然后她找了答案,叫我帮忙运行验证一下,我当时做了一些修改,觉得实现过程还不错,所以记录一下,分享出来学习学习。
题目:有形如这样一个一元三次方程。给出该方程中各项的系数(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一元三次方程求解