描述:
利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2 + bx + c =0的根,其中a不等於0。輸入第一行是待解方程的數目n。
其余n行每行含三個浮點數a, b, c(它們之間用空格隔開),分別表示方程ax2 + bx + c =0的系數。輸出輸出共有n行,每行是一個方程的根:
若是兩個實根,則輸出:x1=...;x2 = ...
若兩個實根相等,則輸出:x1=x2=...
若是兩個虛根,則輸出:x1=實部+虛部i; x2=實部-虛部i
所有實數部分要求精確到小數點后5位,數字、符號之間沒有空格。
x1和x2的順序:x1的實部>Re的實部||(x1的實部==x2的實部&&x1的虛部>=x2的虛部)樣例輸入
3 1.0 3.0 1.0 2.0 -4.0 2.0 1.0 2.0 8.0
樣例輸出
x1=-0.38197;x2=-2.61803 x1=x2=1.00000 x1=-1.00000+2.64575i;x2=-1.00000-2.64575i
提示1、需要嚴格按照題目描述的順序求解x1、x2。
2、方程的根以及其它中間變量用double類型變量表示。
3、函數sqrt()在頭文件math.h中。
4、要輸出浮點數、雙精度數小數點后5位數字,可以用下面這種形式:
printf("%.5f", num);
注意,在使用Java做此題時,可能會出現x1或x2等於-0的情形,此時,需要把負號去掉來源2005~2006醫學部計算概論期末考試
本題是“基礎編程練習1”這篇題里面最難的一個,解釋起來很麻煩,這里就不解釋了(PS:其實就是想偷懶......)
代碼如下:
1 #include<stdio.h> 2 #include<string.h> 3 #include <math.h> 4 int main() 5 { 6 double a,b,c; 7 double delta; 8 int n; 9 scanf("%d",&n); 10 scanf("%lf",&a); 11 while(n!=0) 12 { 13 scanf("%lf%lf",&b,&c); 14 if(a<0) 15 { 16 a=-a;b=-b;c=-c; 17 } 18 delta=b*b-4*a*c; 19 if(delta==0) 20 { 21 printf("x1=x2=%.5lf\n",-b/2/a); 22 } 23 else if(delta>0) 24 { 25 printf("x1=%.5lf;x2=%.5lf\n",(-b+sqrt(delta))/2/a,(-b-sqrt(delta))/2/a); 26 } 27 else 28 { 29 if(b!=0) 30 { 31 if(fabs(sqrt(-delta)/2/a-1)<=1e-6) 32 printf("x1=%.5lf+i;x2=%l.5f-i\n",-b/2/a,-b/2/a); 33 else 34 printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi\n",-b/2/a,sqrt(-delta)/2/a,-b/2/a,sqrt(-delta)/2/a); 35 } 36 else 37 printf("x1=%.5lfi;x2=-%.5lfi\n",sqrt(-delta)/2/a,sqrt(-delta)/2/a); 38 } 39 printf("\n"); 40 scanf("%lf",&a); 41 } 42 }