2025-03-02 学习记录--C/C++-PTA 7-36 复数四则运算
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、题目描述 ⭐️
二、代码(C语言)⭐️
#include <stdio.h>
#include <math.h>
/**
* 输出结果
* @param symbol 运算符:'+' '-' '*' '/'
* @param a1 复数1的实部
* @param b1 复数1的虚部
* @param a2 复数2的实部
* @param b2 复数2的虚部
* @param opt1 结果的实部
* @param opt2 结果的虚部
*/
void getContent(char symbol, double a1, double b1, double a2, double b2,double opt1,double opt2) {
/** 输出等号左边的内容 */
// 处理b1、b2前是否加符号"+":若大于等于0,则加上;否则,不处理。
if(b1 >= 0) {
// %.1f 在 C 语言中是 四舍五入 到小数点后一位,而不是向下取整。
printf("(%.1f%+.1fi) %c (%.1f",a1, b1, symbol, a2);
} else {
printf("(%.1f%.1fi) %c (%.1f",a1, b1, symbol, a2);
}
if(b2 >= 0) {
printf("+%.1fi) = ", b2);
} else {
printf("%.1fi) = ", b2);
}
/** 输出等号右边的内容 */
if((int)(opt1 * 10) == 0 && (int)(opt2 * 10) == 0) {
// 假如 opt1 与 opt2 保留一位小数时,结果是0.0或-0.0时,输出 0.0
// -0 == 0
printf("0.0\n");
} else if((int)(opt1 * 10) == 0) {
// 假如 opt1 保留一位小数时,结果是0.0或-0.0时,只展示 opt2
// -0 == 0
printf("%.1fi\n",opt2);
} else if((int)(opt2 * 10) == 0) {
// 假如 opt2 保留一位小数时,结果是0.0或-0.0时,只展示 opt1
// -0 == 0
printf("%.1f\n",opt1);
} else if(opt2 > 0){
// 如果 opt2 大于0,则其前加个符号"+"
printf("%.1f+%.1fi\n",opt1,opt2);
} else {
// 否则不特殊处理
printf("%.1f%.1fi\n",opt1,opt2);
}
}
int main() {
double a1,b1,a2,b2;
double addR1,addR2, // 加
subtractR1,subtractR2, // 减
multiplyR1,multiplyR2, // 乘
divideR1,divideR2; // 除
scanf("%lf %lf %lf %lf",&a1,&b1,&a2,&b2);
// 加 (a+bi) + (c+di) = (a+c)+(b+d)i
addR1 = a1 + a2;
addR2 = b1 + b2;
getContent('+', a1, b1, a2, b2, addR1, addR2);
// 减 (a+bi) - (c+di) = (a-c)+(b-d)i
subtractR1 = a1 - a2;
subtractR2 = b1 - b2;
getContent('-', a1, b1, a2, b2, subtractR1, subtractR2);
// 乘 (a+b)(c+d)=ac+ad+bc+bd、i^2=-1
multiplyR1 = a1 * a2 + (-1) * b1 * b2; // i^2 == -1
multiplyR2 = a1 * b2 + b1 * a2;
getContent('*', a1, b1, a2, b2, multiplyR1, multiplyR2);
// 除
divideR1 = (a1 * a2 + b1 * b2) / (pow(a2,2) + pow(b2,2));
divideR2 = (b1 * a2 - a1 * b2) / (pow(a2,2) + pow(b2,2));
getContent('/', a1, b1, a2, b2, divideR1, divideR2);
return 0;
}