算法实战(八)

发布时间:2024年01月17日

题目来源(PAT题目)

7-36 复数四则运算

题目

本题要求编写程序,计算2个复数的和、差、积、商。

输入格式:
输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。

输出格式:
分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。

分析

通过输出样式可以发现,有好多地方都重复,那我们可以使用循环来实现操作,把运算符保存到一个数组里面,然后把实部和虚部的计算结果分别保存在两个数组里面。如果两个实部或者虚部,它们的绝对值小于0.05的话,就可以说明该部分为0,就可以不用输出。

题解

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

int main() {
    double a1, b1, a2, b2, a[4], b[4];
    char c[4] = { '+','-','*','/' };
    scanf("%lf %lf %lf %lf", &a1, &b1, &a2, &b2);
    a[0] = a1 + a2; b[0] = b1 + b2;
    a[1] = a1 - a2; b[1] = b1 - b2;
    a[2] = a1 * a2 - b1 * b2; b[2] = b1 * a2 + b2 * a1;
    a[3]= (a1 * a2 + b1 * b2) / (pow(a2, 2) + pow(b2, 2));
    b[3]= (b1 * a2 - a1 * b2) / (pow(a2, 2) + pow(b2, 2));
    for (int i = 0; i < 4; i++) {
        if (fabs(a[i]) > 0.05 && fabs(b[i]) > 0.05) {
            printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf%+.1lfi", a1, b1,c[i], a2, b2, a[i], b[i]);
        }
        else if (fabs(b[i]) > 0.05) {
            printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lfi", a1, b1, c[i], a2, b2, b[i]);
        }
        else if (fabs(a[i]) > 0.05) {
            printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf", a1, b1,c[i], a2, b2, a[i]);
        }
        else {
            printf("(%.1lf%+.1lfi) %c (%.1lf%+.1lfi) = %.1lf", a1, b1, c[i],a2, b2, 0);
        }
        if(i!=3)
            printf("\n");
    }
    return 0;
}

补充

关于题解中的%+.1lf

  1. %lf是double类型数据输出格式。
  2. .1 代表的是小数点后面只保留一位小数。
  3. +:表示如果数值是正数,+号会显式地输出;如果数值是负数,+号不会输出,而是直接输出数值本身。
文章来源:https://blog.csdn.net/m0_49635911/article/details/135635232
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。