Problem L 求一元二次方程的根

2021-08-31 16:27:10 字數 3412 閱讀 6094

一元二次方程的標準形式為ax2+bx+c=0(a≠0),其中a、b、c為常數。求解一元二次方程的根x時有三種情況,分別為(記δ=b2-4ac):

δ>0,有兩個不等的實根;

δ=0,有兩個相同的實根;

δ<0,有兩個共軛的虛根。

輸入為多行,每行為一元二次方程的三個常數a,b,c,在double型別範圍之內。當輸入的a為0時,表示輸入結束。

每行輸入的樣例對應三行輸出。

第一行輸出為樣例的編號。

第二行輸出為所輸入常數a,b,c對應的一元二次方程的標準形式,要求輸出滿足a>0。

第三行輸出為所輸入方程的根,分為三種情況:

若方程滿足δ>0,即有兩不等實根x1、x2,則按順序(先小後大)輸出這兩個實根。

若方程滿足δ=0,即有兩相同實根x,則輸出乙個實根。

若方程滿足δ<0,即有兩共軛的虛根x1、x2,則輸出兩個虛根,虛部符號為正的(即u+vi形式)先輸出,虛部符號為負的(x-yi形式)後輸出。

以上輸出均不輸出數學上無意義或可省略的的符號,所有數值最多保留6位有效數字。每個樣例之後都有乙個空行分隔。

1 2 1

-1 2 -1

-5 2 -0.2

-3 2 0

3 0 12

2 4 4

0sample output

case 1 :

x^2 + 2x + 1 = 0

only one real root : -1

case 2 :

x^2 - 2x + 1 = 0

only one real root : 1

case 3 :

5x^2 - 2x + 0.2 = 0

only one real root : 0.2

case 4 :

3x^2 - 2x = 0

two real roots : 0, 0.666667

case 5 :

3x^2 + 12 = 0

two imaginary roots : 2i, -2i

case 6 :

2x^2 + 4x + 4 = 0

two imaginary roots : -1+i, -1-i

輸出方程格式的各種情況要想清楚,這一部分測試資料給的很全面。另乙個就是浮點數的精度控制,這一部分sample給出了例子。

值得注意的是,linux下gcc編譯的浮點數運算結果有-0,這是oj系統judge端使用的系統;而windows xp下的mingw編譯器和vc6不會產生-0,只會輸出0;但windows 7下的mingw編譯器是能夠產生-0的(確實很詭異)。因此使用windows xp的同學忽略了對結果為0的檢測,程式需要對結果為0的情況進行全面考慮,確保正確的輸出0。這個問題卡了好些同學好幾天。

關於是否會產生-0,輸出表示式0.0/-1的結果就能測試出來。浮點數從負數方向運算出結果為0,則浮點值為-0是符合c語言浮點數運算規則的,目前尚不清楚windows xp系統不能產生-0的原因。

#include

#include

intmain()

if(case_)

printf

("\n");

++case_;

printf

("case %d :\n"

, case_)

;(a ==1)

?printf

("x^2"):

printf

("%lgx^2"

, a);if

(fabs

(b)<

0.0000001);

else

if(b <

-0.0000001

&&fabs

(fabs

(b)-1)

>

0.0000001

)printf

(" - %lgx"

,fabs

(b))

;else

if(b >

0.0000001

&&fabs

(fabs

(b)-1)

>

0.0000001

)printf

(" + %lgx"

,fabs

(b))

;else

if(b <

0.0000001

&&fabs

(fabs

(b)-1)

<

0.0000001

)printf

(" - x");

else

if(b >

0.0000001

&&fabs

(fabs

(b)-1)

<

0.0000001

)printf

(" + x");

if(fabs

(c)<

0.0000001);

else

if(c >

0.0000001

)printf

(" + %lg"

, c)

;else

if(c <

-0.0000001

)printf

(" - %lg"

,fabs

(c))

;printf

(" = 0\n");

double x1, x2, temp;

dt = b * b -

4* a * c;

if(dt >

0.0000001)if

(fabs

(x1)

<

0.0000001

) x1 =0;

if(fabs

(x2)

<

0.0000001

) x2 =0;

printf

("two real roots : %lg, %lg\n"

, x1, x2);}

if(fabs

(dt)

<

0.0000001)if

(dt <

-0.0000001

)elseif(

(-b /(2

* a))==

0&&(fabs

(sqrt(4

* a * c-b * b)/(

2* a)-1

)<

0.0000001))

elseif(

fabs

(sqrt(4

* a * c-b * b)/(

2* a)-1

)<

0.0000001

)else}}

return0;

}

一元二次方程

作 者 a42 覃燕玲 完成日期 2014年 10 月 25 日 版 本 號 v1.0 問題描述 建立乙個程式解平方根 輸入描述 ax 2 bx x 0 a o 程式輸出 平方根 using system using system.collections.generic using system.l...

一元二次方程

一 知識要點 一元二次方程和一元一次方程都是整式方程,它是初中數學的乙個重點內容,也是今後學習數學的基 礎。一元二次方程的一般形式為 ax 2 2為次數,即x的平方 bx c 0,a 0 它是只含乙個未知數,並且未知數的最高次數是2 的整式方程。解一元二次方程的基本思想方法是通過 降次 將它化為兩個...

程式設計求一元二次方程

軟體技術1班 作 者 a29 邢曉康 完成日期 2014年 10 月 25 日 問題描述 程式設計求一元二次方程ax 2 bx c 0 a b using system using system.collections.generic using system.linq using system.t...