1. 程式人生 > >T1058 求一元二次方程(#Ⅰ- 3

T1058 求一元二次方程(#Ⅰ- 3

【題目描述】

求一元二次方程ax^2+bx+c=0的根,其中a不等於0。結果要求精確到小數點後5位。

【輸入】

輸入一行,包含三個浮點數a, b, c(它們之間以一個空格分開),分別表示方程ax^2+bx+c=0的係數。

【輸出】

輸出一行,表示方程的解。

若兩個實根相等,則輸出形式為:“x1=x2=...x1=x2=...”;

若兩個實根不等,在滿足根小者在前的原則,則輸出形式為:“x1=...;x2=...x1=...;x2=...“;

若無實根輸出“No answer!”。

所有輸出部分要求精確到小數點後5位,數字、符號之間沒有空格。

【輸入樣例】

-15.97 19.69 12.02

【輸出樣例】

x1=-0.44781;x2=1.68075

【源程式】

#include<iostream>#include<cstdio>#include<cmath>#define precision_1 1e-12//自己定一精度,用於判斷浮點數大小#define precision_2 1e-6//自己定一精度,用於判斷浮點數大小/*雙精度浮點數表示法:1bit符號位,11bit指數位(用階碼錶示),52bit小數部分(尾數)。因此一個規格化的單精度浮點數x的真值為x=((-1)^S)(1.M)(2^(E-127))
顯然,x永遠也不可能為絕對0。 針對上面的描述,當階碼E為全0且尾數M也全0時,可以認為表示的真值x為計算機中的絕對0值,再結合符號位S,有正0和負0之分; */
/*x1和x2是兩浮點數,precision是自設的精度。可以用 fabs(x1-x2)<=precision來判斷x1和x2是否相等。如果要求更高的精度,把precision定得更小即可*/
usingnamespace std;intmain(){double a,b,c,x1,x2,delta; cin>>a>>b>>c; delta=b*b-4*a*c;//判別式if(delta<0&&fabs(delta)>precision_1)//當判別式小於給定的精度範圍內,即delta<0時,無實根printf
("No answer!\n");elseif(fabs(delta)<precision_1)//當判別式小於給定的精度但>0,此時delta≈0{ x1=-b/(2*a);if(fabs(x1)<precision_2)//超出所給的最小範圍,此時,視為delta=0,直接輸出0printf("x1=x2=%.5lf\n",0);else//未超出所給範圍時,結果仍在小數點後5位有效數字以內,輸出結果printf("x1=x2=%.5lf\n",x1);}else//delta>0時{ x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a);if(fabs(x1)<precision_2) x1=fabs(x1);//小於所給的最高精度,編譯系統視為-0,求絕對值if(fabs(x2)<precision_2) x2=fabs(x2);//小於所給的最高精度,編譯系統視為-0,求絕對值if(x1<x2)//x1、x2中小的數在前輸出printf("x1=%.5lf;x2=%.5lf",x1,x2);elseprintf("x1=%.5lf;x2=%.5lf",x2,x1);}return0;}