pascal中求解一元三次方程问题。。

来源:百度知道 编辑:UC知道 时间:2024/06/20 00:45:40
描述 Description
有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*(x2)<0,则在(x1,x2)之间一定有一个根。

输入格式 Input Format
输入该方程中各项的系数(a,b,c,d 均为实数),

输出格式 Output Format
由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
1 -5 -4 20
-2.00 2.00 5.00

下面是我写的程序,都对了:
var
a,b,c,d,s:real;
i,j:integer;
begin
readln(a,b,c,d);
for i:=-10000 to 10000 do
begin
s:=i/100;
if abs(s*s*s*a+s*s*b+s*c+d)<=0.000001
then begin
inc(j);
if j=3 then begin writeln(s:0:2); halt end
else write(s:0:2,' ')
end;
end;
end.
要加分哦~~
o(∩_∩)o...

楼上程序效率很低啊....
用二分法做吧,给你思路
二分法
数学方面:
一般地,对于函数f(x),如果存在实数c,当x=c时f(c)=0,那么把x=c叫做函数f(x)的零点。
解方程即要求f(x)的所有零点。
先找到a、b,使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
现在假设f(a)<0,f(b)>0,a<b
①如果f[(a+b)/2]=0,该点就是零点,
如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>a,从①开始继续使用
中点函数值判断。
如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2=>b,从①开始继续使用
中点函数值判断。
这样就可以不断接近零点。
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
1 确定区间