文章目录
一【题目难度】
- 乙级
二【题目编号】
- 1051 复数乘法 (15 分)
三【题目描述】
- 复数可以写成 ( A + B i ) (A+Bi) (A+Bi) 的常规形式,其中 A A A 是实部, B B B 是虚部, i i i 是虚数单位,满足 i 2 = − 1 i^2 =−1 i2=−1;也可以写成极坐标下的指数形式 ( R × e ( P i ) ) (R×e^{(Pi)} ) (R×e(Pi)),其中 R R R 是复数模, P P P 是辐角, i i i 是虚数单位,其等价于三角形式 R ( c o s ( P ) + i s i n ( P ) ) R(cos(P)+isin(P)) R(cos(P)+isin(P))。
- 现给定两个复数的 R R R 和 P P P,要求输出两数乘积的常规形式。
四【题目示例】
-
输入格式:
输入在一行中依次给出两个复数的 R 1 , P 1 , R 2 , P 2 R_1 , P_1 , R_2 , P_2 R1,P1,R2,P2 ,数字间以空格分隔。 -
输出格式:
在一行中按照 A+Bi 的格式输出两数乘积的常规形式,实部和虚部均保留 2 位小数。注意:如果 B 是负数,则应该写成 A-|B|i 的形式。 -
输入样例:
2.3 3.5 5.2 0.4 -
输出样例:
-8.68-8.23i
五【解题思路】
- 这个题不难,但是坑巨恶心,首先要理解题意,说简单点就是按照乘法和指数运算得到两个实部和虚部,按照要求输出即可,但是又一个测试点一直过不去,也就是我要说的两个坑:
①:如果当前数字处于 ( − 0.005 , 0 ) (-0.005,0) (−0.005,0)之间,根据四舍五入是0.00,而不是-0.00
②:不要使用float类型,要使用double类型,具体为什么我也不清楚,就是碰巧改了,AC了,如果有懂得希望可以请教!
六【最终得分】
- 15分
七【代码实现】
#include<stdio.h>
#include<math.h>
int main()
{
double R1,P1,R2,P2,R,P,cosP,sinP,A,B;
scanf("%lf %lf %lf %lf",&R1,&P1,&R2,&P2);
R = R1*R2;
P = P1+P2;
cosP = cos(P);
sinP = sin(P);
A = R * cosP;
B = R * sinP;
if(A > -0.005 && A < 0)
{
A = 0;
}
if(B > -0.005 && B < 0)
{
B = 0;
}
if(B >= 0)
{
printf("%.2lf+%.2lfi",A,B);
}
else
{
printf("%.2lf-%.2lfi",A,-B);
}
return 0;
}