5-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。
输入样例1:
2 3.08 -2.04 5.06
输出样例1:
(2.0+3.1i) + (-2.0+5.1i) = 8.1i
(2.0+3.1i) - (-2.0+5.1i) = 4.0-2.0i
(2.0+3.1i) * (-2.0+5.1i) = -19.7+3.8i
(2.0+3.1i) / (-2.0+5.1i) = 0.4-0.6i
输入样例2:
1 1 -1 -1.01
输出样例2:
(1.0+1.0i) + (-1.0-1.0i) = 0.0
(1.0+1.0i) - (-1.0-1.0i) = 2.0+2.0i
(1.0+1.0i) * (-1.0-1.0i) = -2.0i
(1.0+1.0i) / (-1.0-1.0i) = -1.0
解题思路:
这题不难,就是有点繁琐。四种运算输出的格式基本相似,就是运算符不一致。所以把它们输出过程放在了函数里。在输出格式上要多注意题目给的规则。
难点可能在于保留一位小数。因为非 0 不输出,double 型的数据如何比较到小数点后一位?如 0.004 数据应该是不输出的,但与 0 比较又大于 0。这里用的方法是:在比较的时候乘以 10 再强制将其转换成 int 型,这样就可以比较到小数点后一位。
解题代码:
#include<stdio.h>
struct complex {
double a;
double b;
};
void Output (struct complex c[], double i, double j, char s);
int main ()
{
struct complex c[2];
scanf("%lf %lf %lf %lf", &c[0].a, &c[0].b, &c[1].a, &c[1].b);
double i, j; //用来存放最终结果
i = c[0].a + c[1].a;
j = c[0].b + c[1].b;
Output (c, i, j, '+');
i = c[0].a - c[1].a;
j = c[0].b - c[1].b;
Output (c, i, j, '-');
i = c[0].a * c[1].a - c[0].b * c[1].b;
j = c[0].b * c[1].a + c[0].a * c[1].b;
Output (c, i, j, '*');
i = (c[0].a * c[1].a + c[0].b * c[1].b) / (c[1].a * c[1].a + c[1].b * c[1].b);
j = (c[0].b * c[1].a - c[0].a * c[1].b) / (c[1].a * c[1].a + c[1].b * c[1].b);
Output (c, i, j, '/');
return 0;
}
void Output (struct complex c[], double i, double j, char s) {
if (c[0].b >= 0) {
printf("(%.1f+%.1fi) %c", c[0].a, c[0].b, s);
} else {
printf("(%.1f%.1fi) %c", c[0].a, c[0].b, s);
}
if (c[1].b >= 0) {
printf(" (%.1f+%.1fi) ", c[1].a, c[1].b);
} else {
printf(" (%.1f%.1fi) ", c[1].a, c[1].b);
}
if ((int)(i*10)==0 && (int)(j*10)==0) {
printf("= 0.0\n");
} else if ((int)(i*10) == 0) {
printf("= %.1fi\n", j);
} else if ((int)(j*10) == 0){
printf("= %.1f\n", i);
} else if (j > 0) {
printf("= %.1f+%.1fi\n", i, j);
} else {
printf("= %.1f%.1fi\n", i, j);
}
}