今天我的一位学妹拿了一道编程题来问我,我当时没时间,然后她找了答案,叫我帮忙运行验证一下,我当时做了一些修改,觉得实现过程还不错,所以记录一下,分享出来学习学习。
题目:有形如 a x 3 + b x 2 + c x + d = 0 ax^3+bx^2+cx+d=0 ax3+bx2+cx+d=0这样一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100到100之间),且根与根之差的绝对值大于等于1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程 f ( x ) = 0 f(x)=0 f(x)=0,若存在2个实数 x 1 x_{1} x1和 x 2 x_{2} x2,且 x 1 < x 2 x_{1} \lt x_{2} x1<x2, f ( x 1 ) × f ( x 2 ) < 0 f(x_{1})\times f(x_{2})<0 f(x1)×f(x2)<0,则在 ( x 1 , x 2 ) (x_{1},x_{2}) (x1,x2)之间一定有一个根。
一行,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一元三次方程求解