7-36 復數四則運算(15 分)
本題要求編寫程序,計算2個復數的和、差、積、商。
輸入格式:
輸入在一行中按照a1 b1 a2 b2
的格式給出2個復數C1=a1+b1i
和C2=a2+b2i
的實部和虛部。題目保證C2不為0。
輸出格式:
分別在4行中按照(a1+b1i) 運算符 (a2+b2i) = 結果
的格式順序輸出2個復數的和、差、積、商,數字精確到小數點后1位。如果結果的實部或者虛部為0,則不輸出。如果結果為0,則輸出0.0。
輸入樣例1:
2 3.08 -2.04 5.06
輸出樣例1:
(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i
輸入樣例2:
1 1 -1 -1.01
輸出樣例2:
(1.0+1.0i) + (-1.0-1.0i) = 0.0
(1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
(1.0+1.0i) * (-1.0-1.0i) = -2.0i
(1.0+1.0i) / (-1.0-1.0i) = -1.0
思路:這題讓我去學了下高中的數學,做題的時候注意本題有樣例可知進行了四舍五入的做法;所以不能用a==0或者b==0(當然如果你已經做了處理的的話 );還有在前面等號前面看起來固定的輸出,千萬不要去偷懶!
提醒一下abs()是整數的絕對值,fabs()是浮點型的絕對值。最重要的事情要說了,第三個測試點純實數運算,當虛部等於零的時候輸出時前面也要加正號!!
#include<stdio.h> #include<math.h> #include<iostream> using namespace std; double a1, b1, a2, b2; void ccout(double a,char c, double b) { if (b1 >= 0 && (b2 >=0)) //正常人都不會在這兒卡三小時,注意等號!!!/哭死 printf("(%.1lf+%.1lfi) %c (%.1lf+%.1lfi) = ", a1, b1, c, a2, b2); else if ((b1 >= 0) && (b2 < 0)) printf("(%.1lf+%.1lfi) %c (%.1lf%.1lfi) = ", a1, b1, c, a2, b2); else if ((b1<0) && (b2 >= 0)) printf("(%.1lf%.1lfi) %c (%.1lf+%.1lfi) = ", a1, b1, c, a2, b2); else printf("(%.1lf%.1lfi) %c (%.1lf%.1lfi) = ", a1, b1, c, a2, b2); if (fabs(a)<0.1 && fabs(b)<0.1) { printf("0.0\n"); return; } int flag = 0; //用來標記看是否實部有輸出,好解決虛部的符號問題 if (fabs(a)>=0.1) { printf("%.1lf", a); flag++; } if (fabs(b)>=0.1){ if (flag && b > 0.0)printf("+%.1lfi", b); else printf("%.1lfi", b); } cout << endl; //無論什么結果都要輸出回車 } int main() { cin >> a1 >> b1 >> a2 >> b2; double a, b; //加法 a = a1 + a2; b = b1 + b2; ccout(a, '+', b); //減法 a = a1 - a2; b = b1 - b2; ccout(a, '-', b); //乘法 a = a1*a2 - b1*b2; b = a1*b2 + a2*b1; ccout(a, '*', b); //除法 a = (a1*a2 + b1*b2) / (a2*a2 + b2*b2); b = (a2*b1 - a1*b2) / (a2*a2 + b2*b2); ccout(a, '/', b); return 0; }