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

#include <stdio.h>
#include <math.h>
#define EPSILON 0.1
typedef struct {
		double realPart;
		double imaginaryPart;
} COMPLEX;	/* 复数类型 */ 
COMPLEX makeComplex(double r, double i);	/* 构建复数 */ 
void printComplex(COMPLEX c);   /* 输出复数 */ 
void printResult(COMPLEX c);    /* 输出复数 */ 
COMPLEX addComplex(COMPLEX x, COMPLEX y);	/* 复数加法 */ 
COMPLEX subComplex(COMPLEX x, COMPLEX y);	/* 复数减法 */ 
COMPLEX mulComplex(COMPLEX x, COMPLEX y);	/* 复数乘法 */ 
COMPLEX divComplex(COMPLEX x, COMPLEX y);	/* 复数除法 */ 
int main(void) {
    double a1, b1, a2, b2;
    COMPLEX a, b, c;
    scanf("%lf%lf%lf%lf", &a1, &b1, &a2, &b2);
    a = makeComplex(a1, b1);
    b = makeComplex(a2, b2);
    /* 加法 */ 
    printComplex(a);
    printf(" + ");
    printComplex(b);
    printf(" = ");
    c = addComplex(a, b);
    printResult(c);
    /* 减法 */
    printComplex(a);
    printf(" - ");
    printComplex(b);
    printf(" = ");
    c = subComplex(a, b);
    printResult(c);
    /* 乘法 */
    printComplex(a);
    printf(" * ");
    printComplex(b);
    printf(" = ");
    c = mulComplex(a, b);
    printResult(c);
    /* 除法 */
    printComplex(a);
    printf(" / ");
    printComplex(b);
    printf(" = ");
    c = divComplex(a, b);
    printResult(c);
    return 0;
}
COMPLEX makeComplex(double r, double i) {
    COMPLEX temp;
    temp.realPart = r;
    temp.imaginaryPart = i;
    return temp;
}
void printComplex(COMPLEX c) {
    if(c.imaginaryPart >= 0)
        printf("(%.1f+%.1fi)", c.realPart, c.imaginaryPart);
    if(c.imaginaryPart < 0)
        printf("(%.1f%.1fi)", c.realPart, c.imaginaryPart);		    
}
void printResult(COMPLEX c) {	
    if(c.realPart == 0 && c.imaginaryPart == 0)
        printf("%.1f\n", c.realPart);
    if(c.realPart && c.imaginaryPart > 0)
        printf("%.1f+%.1fi\n", c.realPart, c.imaginaryPart);
    if(c.realPart && c.imaginaryPart < 0)
        printf("%.1f%.1fi\n", c.realPart, c.imaginaryPart);
    if(c.realPart && c.imaginaryPart == 0)
        printf("%.1f\n", c.realPart);
    if(c.realPart == 0 && c.imaginaryPart)
        printf("%.1fi\n", c.imaginaryPart);
}
COMPLEX addComplex(COMPLEX x, COMPLEX y) {
    COMPLEX temp;
    temp.realPart = x.realPart + y.realPart;
    if(fabs(temp.realPart) < EPSILON)
		temp.realPart = 0; 
    temp.imaginaryPart = x.imaginaryPart + y.imaginaryPart;
    if(fabs(temp.imaginaryPart) < EPSILON)
		temp.imaginaryPart = 0; 
    return temp;
}
COMPLEX subComplex(COMPLEX x, COMPLEX y) {
    COMPLEX temp;
    temp.realPart = x.realPart - y.realPart;
    if(fabs(temp.realPart) < EPSILON)
		temp.realPart = 0; 
    temp.imaginaryPart = x.imaginaryPart - y.imaginaryPart;
    if(fabs(temp.imaginaryPart) < EPSILON)
		temp.imaginaryPart = 0; 
    return temp;
}
COMPLEX mulComplex(COMPLEX x, COMPLEX y) {
    COMPLEX temp;
    temp.realPart = x.realPart * y.realPart - x.imaginaryPart * y.imaginaryPart;
    if(fabs(temp.realPart) < EPSILON)
		temp.realPart = 0; 
    temp.imaginaryPart = x.realPart * y.imaginaryPart + x.imaginaryPart * y.realPart;
    if(fabs(temp.imaginaryPart) < EPSILON)
		temp.imaginaryPart = 0; 
    return temp;
}
COMPLEX divComplex(COMPLEX x, COMPLEX y) {
    COMPLEX temp;
    double denominator = y.realPart * y.realPart + y.imaginaryPart * y.imaginaryPart;
    temp.realPart = (x.realPart * y.realPart +
                     x.imaginaryPart * y.imaginaryPart) / denominator;
    if(fabs(temp.realPart) < EPSILON)
		temp.realPart = 0; 
    temp.imaginaryPart = (x.imaginaryPart * y.realPart -
                          x.realPart * y.imaginaryPart) / denominator;
    if(fabs(temp.imaginaryPart) < EPSILON)
		temp.imaginaryPart = 0; 
    return temp;
}


复数是由实部虚部组成的数,通常表示为$a + bi$的形式,其中$a$是实部,$b$是虚部,而$i^2 = -1$。对于两个复数$x_1 + y_1i$ $x_2 + y_2i$来说,四则运算可以通过下面的方式实现。 加法: 要执行两个复数相加的操作,只需分别将它们的实部与虚部对应相加即可得到结果。 $$ (x_1 + y_1i) + (x_2 + y_2i) = (x_1+x_2) + (y_1+y_2)i $$ 减法: 类似地,为了从第一个复数中减去第二个复数,需要从第一个复数的实部虚部分别减去第二个复数对应的实部虚部。 $$ (x_1 + y_1i) - (x_2 + y_2i) = (x_1-x_2) + (y_1-y_2)i $$ 乘法: 当涉及到复数之间的乘法时,则应用分配律展开括号,并记住$i^2=-1$这一规则。 $$ (x_1 + y_1i)(x_2 + y_2i) = x_1x_2 + x_1y_2i + y_1ix_2 + y_1iy_2i^2 = (x_1x_2 - y_1y_2) + (x_1y_2 + y_1x_2)i $$ 除法: 对于复数的除法则稍微复杂一些,因为分母含有虚数单位$i$。解决办法是对分子分母同时乘以分母的共轭复数,从而消掉分母中的$i$。 设$c=x_2+iy_2 \neq 0$, 则其倒数为$\frac{\overline{c}}{|c|^2}$, 其中$\overline{c}=x_2-iy_2$ 是$c$的共轭复数,而$|c|$代表模长即 $\sqrt{x_2^2 + y_2^2}$. 因此, $$\frac{(x_1 + iy_1)}{(x_2 + iy_2)}=\frac{(x_1 + iy_1)\cdot(x_2 - iy_2)}{{x_2}^2 + {y_2}^2} = \left(\frac{x_1x_2 + y_1y_2}{x_2^2 + y_2^2}\right)+ i\left(\frac{-x_1y_2 + y_1x_2}{x_2^2 + y_2^2}\right).$$ 在编程环境中实现这些运算是直接的;大多数现代编程语言都提供了内置的支持或者库函数来进行复数计算。例如,在Python中有`complex()`构造器以及相关的算术操作符可以直接用于处理复数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值