您的位置:首页 > 其它

codeves天梯 解一元三次方程

2017-02-08 19:27 211 查看
有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d  均为实数),并约定该方程存在三个不同实根(根的范围在-100至1
4000
00之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个
根。

分析:其实很暴力,就是用分治思想。将10000个数二分查找答案,数据不难,时间还是过得去==。值得注意的倒是精度问题(错了两次都是精度都被卡爆了,下面这种写法是比较推荐的保留小数,基本上不会出精度问题)

const
e=1e-3;

var
a,b,c,d,l,r,m:extended;
i,j:longint;

function f(x:extended):extended;
begin
f:=a*x*x*x+b*x*x+c*x+d;
end;

begin
readln(a,b,c,d);
for i:=-100 to 100 do
begin
if f(i)*f(i-1)<0 then
begin
l:=i-1;
r:=i;
repeat
m:=(l+r)/2;
if f(m)*f(l)<0 then
r:=m
else
if f(m)=0 then
begin
l:=m;
break;
end else
l:=m;
until abs(l-r)<e;
write(l:0:2,' ');
end
else
if f(i)=0 then
write(i,'.00 ');
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: