今天去pta练手,卡在了一道15的题目上,话不多说先看一下题目
复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i2=−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
的形式。
输入样例:
2.3 3.5 5.2 0.4
输出样例:
-8.68-8.23i
分析:
题目中第一个考点就是将指数形式的复数转化成常规形式,复数 (R×e(Pi))可以看成是二维平面下一条长度为R且与X轴夹角为P的线段,因此,实数部分可以看做线段在X轴的投影,虚数部分可以看做线段在Y轴的投影。
复数 (R×e(Pi))的实数部:R*cos(P) 虚数部:R*sin(P) 所以,复数常规形式为:R*cos(P) +R*sin(P) i
复数乘法规则:(a+bi)*(c+di)=(ac-bd)+(ad+bc)i
①输入格式中 (R1×e(P1i))与 (R2×e(P2i))转化为常规形式分别为:R1*cos(P1)+R1*sin(P1)i 和R2*cos(P2)+R2*sin(P2)i
②按照复数乘法规则计算,实数部分:R1*cos(P1)*R2*cos(P2)-R1*sin(P1)*R2*sin(P2)=R1*R2*(cos(P1)*cos(P2)-sin(P1)*sin(P2))
虚数部分:R1*cos(P1)*R2*sin(P2)-R1*sin(P1)*R2*cos(P2)=R1*R2*(cos(P1)*sin(P2)-sin(P1)*cos(P2))
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
double r1,r2,p1,p2;
cin>>r1>>p1>>r2>>p2;
double a=r1*r2*(cos(p1)*cos(p2)-sin(p1)*sin(p2));
double b=r1*r2*(cos(p1)*sin(p2)+cos(p2)*sin(p1));
if(b>0)
printf("%.2f+%.2fi",a,b);
else
printf("%.2f%.2fi",a,b);
return 0;
}
运行结果:
结果表明测试点2、3错误,最开始认为可能是由于舍入问题导致的,于是进行测试,测试代码段如下:
double a=0.004,b=0.005;
printf("a=%.2f\nb=%.2f",a,b);
结果如下:
所以,程序中的数据舍入就是按照四舍五入,测试点2,3与舍入问题无关。最后,发现当a或b的取值在区间(-0.005,0)时,a与b的取值为:a=-0.00,b=0.00。于是将代码修改如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
double r1,r2,p1,p2;
cin>>r1>>p1>>r2>>p2;
double a=r1*r2*(cos(p1)*cos(p2)-sin(p1)*sin(p2));
double b=r1*r2*(cos(p1)*sin(p2)+cos(p2)*sin(p1));
if(a>-0.005&&a<0)
a=0;
if(b>-0.005&&b<0)
b=0;
if(b>=0)
printf("%.2f+%.2fi",a,b);
else
printf("%.2f%.2fi",a,b);
return 0;
}
///测试点3针对a出现-0.00,测试点2针对b出现-0.00