「PAT乙级真题解析」Basic Level 1051 复数乘法 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目给出了复数的极坐标形式和三角形式的对应公式. 要求输出的结果是三角形式, 乘积计算时也主要使用三角形式, 所以本题就是形式转换加对应部分的乘法计算。

#算法#数据结构#需求分析#c语言#pat考试

Table of Contents

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT乙级BasicLevelPractice 1051

问题分析

题目给出了复数的极坐标形式和三角形式的对应公式. 要求输出的结果是三角形式, 乘积计算时也主要使用三角形式, 所以本题就是形式转换加对应部分的乘法计算。

完整描述步骤

  1. 获取极坐标形式的两个复数
  2. 转换成三角形式: A1 + B1 * i, A2 + B2 * i
  3. 计算乘积product = (A1 * A2 - B1 * B2) + (A1 * B2 + A2 * B1) * i
  4. 按格式输出结果

伪代码描述

  1. get input: R1, P1, R2, P2
  2. transform the complex number as A1 + B1 * i and A2 + B2 * i
    • A1 = R1 * cos(P1)
    • B1 = R1 * sin(P1)
    • A2 = R2 * cos(P2)
    • B2 = R2 * sin(P2)
  3. calculate product = (A1 * A2 - B1 * B2) + (A1 * B2 + A2 * B1) * i = A3 + B3 * i
  4. print(A3)
  5. if B3 >= 0: print("+" + B3 + "i")
    • else print(B3 + "i")

【注意事项】 由于浮点数二进制储存原因, 所以跟0的比较不能是>=0, 而是检查跟0的差值是否在小误差内(一般取1E-6) 而由于题设要求保留到两位小数, 小误差使用到小数点后第三位, 取0.005

完整提交代码

/*
# 问题分析
题目给出了复数的极坐标形式和三角形式的对应公式. 
要求输出的结果是三角形式, 乘积计算时也主要使用三角形式,
所以本题就是形式转换加对应部分的乘法计算。
 
# 完整描述步骤
1. 获取极坐标形式的两个复数
2. 转换成三角形式: A1 + B1 * i, A2 + B2 * i
3. 计算乘积product = (A1 * A2 - B1 * B2) + (A1 * B2 + A2 * B1) * i
4. 按格式输出结果
 
 
# 伪代码描述
1. get input: R1, P1, R2, P2
2. transform the complex number as A1 + B1 * i and A2 + B2 * i
    - A1 = R1 * cos(P1)
    - B1 = R1 * sin(P1)
    - A2 = R2 * cos(P2)
    - B2 = R2 * sin(P2)
3. calculate product = (A1 * A2 - B1 * B2) + (A1 * B2 + A2 * B1) * i
                     = A3 + B3 * i
4. print(A3)
5. if B3 >= 0: print("+" + B3 + "i")
    - else print(B3 + "i")
 
【注意事项】
由于浮点数二进制储存原因, 所以跟0的比较不能是>=0, 
而是检查跟0的差值是否在小误差内(一般取1E-6)
而由于题设要求保留到两位小数, 小误差使用到小数点后第三位, 取0.005
*/
#include <math.h>
#include <stdio.h>
 
int main() {
  double A_complex[2];
  double B_complex[2];
  double product_complex[2];
 
  double R1, P1, R2, P2;
  scanf("%lf %lf %lf %lf", &R1, &P1, &R2, &P2);
  A_complex[0] = R1 * cos(P1);
  A_complex[1] = R1 * sin(P1);
  B_complex[0] = R2 * cos(P2);
  B_complex[1] = R2 * sin(P2);
 
  product_complex[0] =
      A_complex[0] * B_complex[0] - A_complex[1] * B_complex[1];
  product_complex[1] =
      A_complex[0] * B_complex[1] + A_complex[1] * B_complex[0];
 
  if (product_complex[0] + 0.005 >= 0 && product_complex[0] < 0)
    printf("0.00");
  else
    printf("%.2f", product_complex[0]);
  if (product_complex[1] >= 0)
    printf("+%.2fi", product_complex[1]);
  else if (product_complex[1] + 0.005 >= 0 && product_complex[1] < 0)
    printf("+0.00i");
  else
    printf("%.2fi", product_complex[1]);
  return 0;
  return 0;
}
「PAT乙级真题解析」Basic Level 1051 复数乘法 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果