5-36 复数四则运算

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

输入格式:

输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1iC2=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
"); 
	} else if ((int)(i*10) == 0) {
		printf("= %.1fi
", j);
	} else if ((int)(j*10) == 0){
		printf("= %.1f
", i);
	} else if (j > 0) {
		printf("= %.1f+%.1fi
", i, j);
	} else {
		printf("= %.1f%.1fi
", i, j);
	}	
}
原文地址:https://www.cnblogs.com/andywenzhi/p/5738670.html