whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1051 || 复数乘法(详解,C/C++示例,测试点分析)

Posted on 2019-10-01 In PAT

复数乘法

题目描述

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

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

输入格式

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

输出格式

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

输入样例

1
2.3 3.5 5.2 0.4

输出样例

1
-8.68-8.23i

问题解决

解题思想

对于两个指数形式的复数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),即:

1
2
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++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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;
}

题目来源:PAT乙级1051
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1050 || 螺旋矩阵(详解,C/C++示例,测试点分析)
PAT乙级1052 || 卖个萌(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 复数乘法
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例
    5. 1.5. 输出样例
    6. 1.6. 问题解决
      1. 1.6.1. 解题思想
      2. 1.6.2. 坑点提醒
      3. 1.6.3. 代码示例(C/C++)
© 2021 Mengzhao Wang