【欢迎关注微信公众号:计算机黑科学大全,对话框回复:PAT乙级真题】获取全部真题详解及代码示例
个人博客地址:https://mzwang.top
复数乘法
题目描述:
复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i 2 i^2 i2=−1;也可以写成极坐标下的指数形式 (R×e(Pi)),其中 R 是复数模,P 是辐角,i 是虚数单位,其等价于三角形式 (R(cos§+i×sin§)。
现给定两个复数的 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
题目来源:PAT乙级1051
作者:CHEN, Yue
单位:浙江大学
问题解决:
解题思想
对于两个指数形式的复数R1×e(P1i)与R2×e(P2i),它们的乘积为R1×R2×e((P1+P2)i),设R3=R1×R2,P3=P1+P2,即为R3×e(P3i),它对应的三角形式为:(R3(cos(P3)+i×sin(P3)),设其对应的常规形式A+Bi,A=R3×cos(P3),B=R3×sin(P3),即:
A = (R1×R2)×cos(P1+P2)
B = (R1×R2)×sin(P1+P2)
这个过程在纸上演算一边就很清楚了。
此题的难点在于输出的控制,对A而言,绝对值小于0.005的都输出0.00
,对B而言,绝对值小于0.005的都输出+0.00
。其余的A正常输出就行,其余的B,大于0的需要输出+
,其余正常输出就行。
坑点提醒
最后两个测试点分别测试B和A的绝对值小于0.005的情况。
代码示例(C/C++)
小提示:请将以下代码保存为.cpp
格式(C++程序)左右滑动代码以查看完整代码(复制本文链接到电脑端浏览效果更佳)
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
double R1,P1,R2,P2,R3,P3,A,B;
scanf("%lf%lf%lf%lf",&R1,&P1,&R2,&P2);
R3 = R1 * R2; //按照指数形式相乘得到两个复数乘积的系数
P3 = P1 + P2;
A = R3 * cos(P3); //由三角形式转化为常规形式
B = R3 * sin(P3);
if(fabs(A) < 0.005){ //对A,绝对值小于0.005的都是0.00
printf("0.00");
}
else{
printf("%.2lf",A);
}
if(fabs(B) < 0.005) { //对B,绝对值小于0.005的都输出:+0.00i
printf("+0.00i");
}
else{
if(B > 0){
printf("+");
}
printf("%.2lfi",B);
}
return 0;
}