本题要求编写程序,计算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 型,这样就可以比较到小数点后一位。
解题代码:
#includestruct 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); } }