复数乘法 (PATB-1051)

题面

复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i^2=−1;也可以写成极坐标下的指数形式 (R×e^(Pi)),其中 R 是复数模,P 是辐角,i 是虚数单位,其等价于三角形式 R(cos(P)+isin(P))。

现给定两个复数的 R 和 P,要求输出两数乘积的常规形式。

输入

输入在一行中依次给出两个复数的 R1, P1, R2, P2,数字间以空格分隔。

输出

在一行中按照 A+Bi 的格式输出两数乘积的常规形式,实部和虚部均保留 2 位小数。注意:如果 B 是负数,则应该写成 A-|B|i 的形式。

样例输入

12.3 3.5 5.2 0.4

样例输出

1-8.68-8.23i

提示

思路

代码

 1#define Sg(u) ((u) > eps ? 1 : ((u) < -eps ? -1 : 0))
 2#define Abs(u) (Sg(u) >= 0 ? (u) : -(u))
 3#define Ze(u) (!Sg(u))
 4typedef double DB;
 5const DB eps = 5e-3;
 6
 7int main()
 8{
 9    DB r1, p1, r2, p2;
10    scanf("%lf %lf %lf %lf", &r1, &p1, &r2, &p2);
11
12    DB a = r1*cos(p1) * r2*cos(p2) - r1*sin(p1) * r2*sin(p2);
13    DB b = r1*cos(p1) * r2*sin(p2) + r2*cos(p2) * r1*sin(p1);
14
15    if(Ze(a))
16        a = 0.0;
17    printf("%.2lf", a);
18
19    if(Ze(b))
20        b = 0.0;
21
22    if(Sg(b) >= 0)
23        printf("+");
24
25    printf("%.2lfi\n", b);
26
27    return 0;
28}