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...