复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i^2=−1;也可以写成极坐标下的指数形式 (R×e^(Pi)),其中 R 是复数模,P 是辐角,i 是虚数单位,其等价于三角形式 R(cosP+isinP)。
现给定两个复数的 R 和 P,要求输出两数乘积的常规形式。
输入格式:
输入在一行中依次给出两个复数的 R1, P1, R2, P2,数字间以空格分隔。
输出格式:
在一行中按照 A+Bi 的格式输出两数乘积的常规形式,实部和虚部均保留 2 位小数。注意:如果 B 是负数,则应该写成 A-|B|i 的形式。
输入样例:
2.3 3.5 5.2 0.4
输出样例:
-8.68-8.23i
分析
- 读入两个复数R、P
- A = R*COSP
- B = R*SINP
- 两个复数相乘
(a+bi)(c+di)=(ac-bd)+(bc+ad)i
源码
#include <stdio.h>
#include <math.h>
int main()
{
double R1, P1, R2, P2;
double A1, B1, A2, B2;
double A, B;
scanf("%lf %lf %lf %lf", &R1, &P1, &R2, &P2);
A1 = R1*cos(P1);
B1 = R1*sin(P1);
A2 = R2*cos(P2);
B2 = R2*sin(P2);
//printf("%.2lf %.2lf %.2lf %.2lf", A1, B1, A2, B2);
A = (A1*A2-B1*B2);
B = (B1*A2+A1*B2);
//printf("%.2lf %.2lf", A, B);
if(fabs(A)<0.01)
{
A = 0.00;
}
if(fabs(B)<0.01)
{
B = 0.00;
}
if(B<0)
{
printf("%.2lf-%.2lfi", A, fabs(B));
}
else
{
printf("%.2lf+%.2lfi", A, B);
}
return 0;
}
小结
这道题有个坑,就是由于要保留最后的两位小数,如果A或B的绝对值<0.01,则会被截断为0.00或-0.00,问题就出在这个-0.00上面。会导致最后两个测试点过不去。我们可以通过当A或B的绝对值小于0.01时,直接将其置零的操作来解决这个问题
参考资料
- 复数运算法则
https://baike.baidu.com/item/%E5%A4%8D%E6%95%B0%E8%BF%90%E7%AE%97%E6%B3%95%E5%88%99
- 最后两个测试点参考
https://www.jianshu.com/p/9d0b6f9638b3
https://blog.csdn.net/A_D_E/article/details/90170459
该博客介绍了如何使用C语言实现复数乘法,基于输入的复数模(R)和辐角(P),并输出乘积的常规形式。在处理过程中,博主指出一个小陷阱,即当实部或虚部绝对值小于0.01时会被截断为-0.00,导致测试失败。解决方案是将这种情况下实部或虚部置零。文章提供了源代码和参考资料链接,帮助读者理解和解决类似问题。
5815

被折叠的 条评论
为什么被折叠?



