解題報告 一元三次方程求解

2022-06-04 02:36:08 字數 1781 閱讀 3538

1. 

題目一元三次方程求解

有形如:ax^3+bx^2+cx+d=0 

這樣的乙個一元三次方程。給出該方程中各項的係數(a,

b,c,

d 均為實數

),並約定該方程存在三個不同實根

(根的範圍在

-10000

至1000

0之間)

,且根與根之差的絕對值》=1

。要求由小到大依次在同一行輸出這三個實根(

根與根之間留有空格

),並精確到小數點後4位。

輸入格式

一行4個實數,分別表示三次項係數,二次項係數,一次項係數,常數項(每個的係數均保證絕對值在

10^9

以內)輸出格式

一行三個實數,為方程的3

個實根,精確到小數點後4位

輸入樣例

1 0 -1 0

輸出樣例

-1.0000 0.0000 1.0000

2. 題目實質

noip 2001 提高組 第一題 。。。。。。的改版。

3. 演算法

列舉每乙個長度為

1 的區間,然後,當發現區間的兩個端點代到方程中後,恰好乙個為正值,乙個為負值,這就說明這個區間中有乙個根。(不知道為什麼的回去問數學老師去)

然後,對這個區間進行二分,原理還是當兩個端點代到方程中後,恰好乙個為正值,乙個為負值,這就說明這個範圍內有乙個根。

二分到出現精確根,或是精度夠了為止。

4. 注意事項

原版可以用列舉,但改版只能用二分。

注意這一句「

根與根之差的絕對值》=1

」,別想太複雜了,直接二分長度為

1 的區間就行了。

5. **

二分 (zsz)

program test(input,output);

var a,b,c,d,q,p:real;

ans:array[1..3]of real;

i,t:longint;

function f(x:real):real;

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

function findx(i:real):real;

begin

p:=i;q:=p+0.999999;

if(abs(f(p))<0.00001)then findx:=p

else begin

while(p+0.000010)do

if(f(p)*f((p+q)/2)<0)then q:=(p+q)/2

else p:=(p+q)/2;

exit((p+q)/2);

end;

end;

begin

assign(input,'equation.in');reset(input);

assign(output,'equation.out');rewrite(output);

readln(a,b,c,d);t:=0;

for i:=-10000 to 10000 do

begin

if(abs(f(i))<0.000001)or(f(i)*f(i+0.999999)<=0)then

begin inc(t);ans[t]:=findx(i);end;

if t=3 then break;

end;

for t:=1 to 3 do

write(ans[t]:0:4,' ');

close(input);

close(output);

end.

一元三次方程求解

有形如 ax 3 bx 2 cx d 0這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點後2位。輸入有多行測試資料...

一元三次方程求解

問題描述 有形如 ax 3 bx 2 cx d 0 這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d 均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求三個實根。輸入格式 四個實數 a,b,c,d 輸出格式 由小到大依次在同一行輸出這...

一元三次方程求解

有形如 ax3 bx2 cx d 0 這樣的乙個一元三次方程。給出該方程中各項的係數 a,b,c,d 均為實數 並約定該方程存在三個不同實根 根的範圍在 100至100之間 且根與根之差的絕對值 1。要求由小到大依次在同一行輸出這三個實根 根與根之間留有空格 並精確到小數點後2位。輸入格式 一行,4...