PTA 基础编程题目集 7-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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

解析

本题要实现复数的加减乘除四则运算,直接简单粗暴创建一个复数结构体,存放实部和虚部两个成员变量,并在结构体中定义加减乘除这四种结构体函数。加减法比较简单,只需实现两个复数实部与虚部之间分别相加或相减即可。乘法实现如下:用数一实部乘数二实部减去数一虚部乘数二虚部,得到结果的实部;用数一实部乘数二虚部加上数一虚部乘数二实部,得到结果的虚部。除法实现如下:(a+bi)/(c+di)=(a+bi)*(c-di)/(c2+d2),其中(a+bi)*(c-di)的结果可由前面实现的复数乘法得到,c2+d2是一个实数,然后再将(a+bi)*(c-di)的实部和虚部分别除以(c2+d2),得到结果的实部和虚部。乘法和除法的实现方式与我们平时算复数乘除法的方法类似。
然后就是要注意输出的格式问题了。首先,题目要求保留一位小数输出,所以要分别将实部和虚部精确到小数点后一位。这里用到了<math.h>库中的round()函数,round()函数用来四舍五入取整,而这里要求保留一位小数,可以巧妙地运用round(num*10)/10的方法来实现;类似地,保留两位小数可以用round(num*100)/100来实现。另外,两个运算数和运算结果的输出方式有所不同,运算数部分要按照题目中给定的格式“(a1+b1i) 运算符 (a2+b2i) = ”来输出,但是当虚部为负时,虚部前面的’+'号应当省略,如"1-i"不应当写成"1+-i"。而在输出运算结果的时候,如果结果的实部或者虚部为0,则不输出;如果结果为0,则输出0.0。

代码

#include <iostream>
#include <cmath>
using namespace std;

struct fushu
{
	double shibu;
	double xubu;
	fushu()
	{
		shibu=0.0;
		xubu=0.0;	
	}
	fushu(double a,double b)
	{
		shibu=a;
		xubu=b;
	}
	fushu add(fushu c)
	{
		fushu res;
		res.shibu=this->shibu+c.shibu;
		res.xubu=this->xubu+c.xubu;
		return res;
	}
	fushu sub(fushu c)
	{
		fushu res;
		res.shibu=this->shibu-c.shibu;
		res.xubu=this->xubu-c.xubu;
		return res;
	}
	fushu mul(fushu c)
	{
		fushu res;
		res.shibu=this->shibu*c.shibu-this->xubu*c.xubu;
		res.xubu=this->shibu*c.xubu+this->xubu*c.shibu;
		return res;
	}
	fushu div(fushu c)
	{
		fushu res;
		fushu tmp;
		tmp.shibu=c.shibu;
		tmp.xubu=-c.xubu;
		res=this->mul(tmp);
		double temp=c.shibu*c.shibu+c.xubu*c.xubu;
		res.shibu/=temp;
		res.xubu/=temp;
		return res;
	}
};

void print_num(fushu c)
{
	double shi=1.0*round(c.shibu*10)/10;
	double xu=1.0*round(c.xubu*10)/10;
	if(xu<0) printf("(%.1f%.1fi)",shi,xu);
	else printf("(%.1f+%.1fi)",shi,xu);
}

void print_res(fushu c)
{
	double shi=1.0*round(c.shibu*10)/10;
	double xu=1.0*round(c.xubu*10)/10;
	if(shi==0.0&&xu==0.0) cout<<"0.0";
	else if(shi==0.0&&xu!=0.0) printf("%.1fi",xu);
	else if(shi!=0.0&&xu==0.0) printf("%.1f",shi);
	else
	{
		if(xu<0) printf("%.1f%.1fi",shi,xu);
		else printf("%.1f+%.1fi",shi,xu);
	}
}

int main()
{
	double a1,b1,a2,b2;
	cin>>a1>>b1>>a2>>b2;
	fushu c1(a1,b1),c2(a2,b2);
	fushu res[4];
	res[0]=c1.add(c2);
	res[1]=c1.sub(c2);
	res[2]=c1.mul(c2);
	res[3]=c1.div(c2);
	print_num(c1);printf(" + ");print_num(c2);printf(" = ");print_res(res[0]);printf("\n");
	print_num(c1);printf(" - ");print_num(c2);printf(" = ");print_res(res[1]);printf("\n");
	print_num(c1);printf(" * ");print_num(c2);printf(" = ");print_res(res[2]);printf("\n");
	print_num(c1);printf(" / ");print_num(c2);printf(" = ");print_res(res[3]);printf("\n");
	return 0;
} 

运行结果

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神箭手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值