【题解】PATB-1051 复数乘法

复数乘法 (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 的形式。

样例输入

1
2.3 3.5 5.2 0.4

样例输出

1
-8.68-8.23i

提示

思路

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define Sg(u) ((u) > eps ? 1 : ((u) < -eps ? -1 : 0))
#define Abs(u) (Sg(u) >= 0 ? (u) : -(u))
#define Ze(u) (!Sg(u))
typedef double DB;
const DB eps = 5e-3;

int main()
{
DB r1, p1, r2, p2;
scanf("%lf %lf %lf %lf", &r1, &p1, &r2, &p2);

DB a = r1*cos(p1) * r2*cos(p2) - r1*sin(p1) * r2*sin(p2);
DB b = r1*cos(p1) * r2*sin(p2) + r2*cos(p2) * r1*sin(p1);

if(Ze(a))
a = 0.0;
printf("%.2lf", a);

if(Ze(b))
b = 0.0;

if(Sg(b) >= 0)
printf("+");

printf("%.2lfi\n", b);

return 0;
}