目录
题目
题目描述
输入:一行四个实数a,b,c,d。
输出:一行三个实根,从小到大输出,并精确到小数点后两位。
样例
输入
1 -5 -4 20
输出
-2.00 2.00 5.00
用到的一元三次方程性质
图像特征
可以求出三个根的范围
根的性质
f(x)=0,若存在两个数x1,x2且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根。
方程的根 相当于 函数的零点,那题目说的特殊的一元三次方程的根,两边的函数值一定是异号的。(看图片只有两种情况)
就是要根据异号来二分查找。
说明在二分查找的时候要一直保持两端点值带入方程后是异号的。
整体思路
先都用double定义数据,
一点一点的平方根号,计算出x1,x2的值。(C语言根号sqrt(),头文件#include<math,h>)
然后分三次运用二分查找。第一次(-100,x1),第二次(x1,x2),第三次(x2,100)。
(要求是按顺序输出①②③,二分查找的时候看好查找顺序,就不用排序了。)
查找的时候每次找使f(x)异号的两端点进行下一次查找。结束条件是两端点值差的绝对值小于0.001
然后输出任意一个端点就好了
(因为判断小于0.001时精确度比题目要求的多一位,两端点在精确到0.01时数值是一样的)
看到这里如果有思路了,可以先自己写写试试,实在不行再看接下来的。
二分函数具体思路
以-100<①<x1举例,
求二分的函数需要两个参数,(-100,x1)。
计算中点a= (-100+x1)/2
求得三个数的正负号,f(-100)<0,f( a)<0,f(x1)>0
(这里可以再定义一个函数返回0/1来判断正负。增加代码可读性)
则需要求的①在区间(a,x1)中。然后进行下一次查找。
还是判断f(a),f(x1),f((a+x1)/2) 三者的正负,再进行下一次查找。
递归的结束条件:两端点值差的绝对值小于0.001(比题目要求的精确度高一位就好)
代码
(看看代码整理一下整体思路,我的代码还有好多可以优化的地方,自己有思路了,写出来估计会更简洁)