一元二次方程的標準形式為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...