1051 复数乘法(15) - PAT乙级

1051 复数乘法(15)

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

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

输入格式:

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

输出格式:

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

输入样例:

2.3 3.5 5.2 0.4

输出样例:

-8.68-8.23i

Solution:

需要补充(复习)一下复数的运算法则:

(a+ib) + (c+id) = (a+c)+(b+d)i
(a+ib) - (c+id) = (a-c)+(b-d)i

复数的乘法:
(a+ib) * (c+id) = ac + adi + bci + bdi^2
= ac + (ad+bc)i - bd
= (ac-bd) + (ad+bc)i

这题里面给出的三角形式有问题, 给出的公式少了一个括号, 如果按照 R*cos(P) + i*sin(p)进行转换的话, 是有问题的.

因为正确的公式是 R * ( cos(p) + i*sin(p) ), 带入后可以得到最终的A+Bi

double A = r1 * r2 * cos(p1) * cos(p2) - r1 * r2 * sin(p1) * sin(p2);
double B = r1 * r2 * cos(p1) * sin(p2) + r1 * r2 * sin(p1) * cos(p2);

另外这题要注意的是, 要把-0.00-0.00i ==转换成==> 0.00+0.00i
如果A实际比0小, 但是很接近0, 不处理的话, 会出现-0.00的情况,
同理B是一样的, 但无论是什么情况, B都要带上i

#include <cstdio>
#include <cmath>

int main() {
double r1, p1, r2, p2;
scanf("%lf %lf %lf %lf", &r1, &p1, &r2, &p2);
double A = r1 * r2 * cos(p1) * cos(p2) - r1 * r2 * sin(p1) * sin(p2);
double B = r1 * r2 * cos(p1) * sin(p2) + r1 * r2 * sin(p1) * cos(p2);
// A = -0.0005;
// B = -0.0005;
if (A + 0.005 >= 0 && A < 0) {
printf("0.00");
} else {
printf("%.2lf", A);
}

if (B >= 0) {
printf("+%.2lfi\n", B);
} else if (B + 0.005 >= 0 && B < 0) {
printf("+0.00i\n"); // 我并不知道有这种边界条件, 为什么0的时候还有i日
} else {
printf("%.2lfi\n", B);
}

return 0;
}