PTA 复数的运算

要求:

用输入的四个实数,构造两个复数(按实部,虚部序分配),并根据第一个输入的实数的小数部分是否为零,确定构造的是两个整数复数或是两个实数复数。然后分别在五行中输出:复数1复数2复数1+复数2复数/复数2复数1 比较 复数2
复算数的运算规则此处略去不表。复数的比较规则约定为:先比实部实部相同才比较虚部,比较结果用{1|0|-1}之一表示(分别对应:大|等|小)。

输入格式:

一行中输入用逗号分隔的四个实数,用a,b,c,d来表示,构成两个复数,c1=a+bi,c2=c+di,如果第一个数据a的整数部分与整个实数相同(相当于小数点后均为零)则所有复数均在整数(int)的集合中考虑包括运算否则所有复数的定义域为实数(double)
总而言之四个实数确定了两个复数(实部,虚部),且第一个实数的小数部分确定了复数的定义域。定义域不同,运算结果不同。

输出格式:

如前述,输入四个实数,但第一个数的小数部分的有无,决定了构造的两个复数c1,c2的定义域是整数(int)还是实数(double)。
输出的的五行内容分别是:第一个复数,第二个复数,这两个复数的和,这两个复数的商,这两个复数的大小比较。题目确保输入的第二个复数不会为零。
关于复数的输出格式:输出在一对[]中,应该满足以下输出习惯:都为零是只输出一个零有一个为零时只输出非零的部分,虚部为负时,如:3-4i,不要输出为:3+-4i。整数不要输出小数部分实数的小数部分非零时保留3位小数实数的小数部分为零时不要输出小数部分(按整数输出)。

思路:

这道题的要求比较严格,其中复数的除法,以及输出格式是两个难点。因此博主这边的输出函数占了100行左右~...~

声明:

我在写这道题的时候本想参考一下更别人精妙的办法,但上网搜了半天也没找到这道题的代码,所以就先发表一下我的见解。博主这边只是一个大一刚学C++的菜菜,代码肯定存在一些bug,但做这道题还是绰绰有余的,希望我的博客能够起到抛砖引玉的作用。

输入样例1: 

28.000,-45.789,-28.02468,1.1357

输出样例1:

[28-45i]
[-28+1i]
[-44i]
[-1+1i]
1

输入样例2:

23.001,-89.0,-23.001,0

输出样例2:

[23.001-89i]
[-23.001]
[-89i]
[-1+3.869i]
1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

 代码:

~~~c #
#include<bits/stdc++.h>
using namespace std;
int sign=0;//sign主要是用在输出中来判断是int还是 float 
//用结构体来存复数的实部和虚部 
struct plural{
	float sb;//定义实s部b 
	float xb;//定义虚x部b 
};
//复数的加法 
struct plural add(struct plural x,struct plural y){
	struct plural rr;
	rr.sb=x.sb+y.sb;
	rr.xb=x.xb+y.xb;
	return rr;
}
//复数的除法 
struct plural divide(struct plural x,struct plural y){
	struct plural rr;
	
	rr.sb=(x.sb*y.sb+x.xb*y.xb)/(y.sb*y.sb+y.xb*y.xb);
	rr.xb=(x.xb*y.sb-x.sb*y.xb)/(y.sb*y.sb+y.xb*y.xb);
	return rr;
}
//复数的输出 
void show(struct plural x){
	if(sign==1)//int型 
	{if(x.sb==0)
	{
		if(x.xb==0)
		printf("[0]\n");
		else
		{
			if(x.xb>0)
			printf("[+%gi]\n",x.xb);
			else
			printf("[%gi]\n",x.xb);
		}
		
	}
	else
	{
		if(x.xb>0)
		printf("[%g+%gi]\n",x.sb,x.xb);
		else if(x.xb==0)
		printf("[%g]\n",x.sb);
		else
		printf("[%g%gi]\n",x.sb,x.xb);
	}
	}
	//分割线// 
	else/*float型 ,这里与上面int型的不同之处在于,根据题干的要求float 型
	    要多一步判断:若小数点后面全为0,则不输出0,反之则保留三位小数*/
	{if(x.sb==0)
	{
		if(x.xb==0)
		printf("[0]\n");
		else
		{
			if(x.xb>0)
			{
				if(x.xb==(int)x.xb)//上面声明中的判断 
				printf("[+%.0fi]\n",x.xb);
				else
				printf("[+%.3fi]\n",x.xb);
			}
			else
			{
				if(x.xb==(int)x.xb)//同上 
				printf("[%.0fi]\n",x.xb);
				else
				printf("[%.3fi]\n",x.xb);
			}
		}
		
	}
	else
	{
		if(x.xb>0)
		{
			if(x.sb==(int)x.sb)//同上 
			{
				if(x.xb==(int)x.xb)//同上 
				printf("[%.0f+%.0fi]\n",x.sb,x.xb);
				else
				printf("[%.0f+%.3fi]\n",x.sb,x.xb);
			}
			else
			{
				if(x.xb==(int)x.xb)//同上 
				printf("[%.3f+%.0fi]\n",x.sb,x.xb);
				else
				printf("[%.3f+%.3fi]\n",x.sb,x.xb);
			}
		}
		else if(x.xb==0)
		{
			if(x.sb==(int)x.sb)//同上 
			{
				printf("[%.0f]\n",x.sb);
			}
			else
			{
				printf("[%.3f]\n",x.sb);
			}
		}
		else
		{
			if(x.sb==(int)x.sb)//同上 
			{
				if(x.xb==(int)x.xb)//同上 
				printf("[%.0f%.0fi]\n",x.sb,x.xb);
				else
				printf("[%.0f%.3fi]\n",x.sb,x.xb);
			}
			else
			{
				if(x.xb==(int)x.xb)//同上 
				printf("[%.3f%.0fi]\n",x.sb,x.xb);
				else
				printf("[%.3f%.3fi]\n",x.sb,x.xb);
			}
		}
	}
	}
}
//复数比大小 
int judge(struct plural x,struct plural y){
	if(x.sb>y.sb)
	return 1;
	else if(x.sb<y.sb)
	return -1;
	else
	{
		if(x.xb>y.xb)
		return 1;
		else if(x.xb<y.xb)
		return -1;
		else
		return 0;
	}
}
int main()
{
	struct plural x2,x4,x6,x1;//博主突发奇想先定义2和4,然后用6表示2+4,用1表示2/4(四舍五入为1) 
	cin>>x2.sb;
	getchar();//吸收逗号 
	cin>>x2.xb;
	getchar();//
	cin>>x4.sb;
	getchar();//
	cin>>x4.xb;
	if(x2.sb==(int)x2.sb)//对第一个数判断全局中变量的类型 
	{
		x2.sb=(int)(x2.sb);
		x2.xb=(int)(x2.xb);
		x4.sb=(int)(x4.sb);
		x4.xb=(int)(x4.xb);
		sign=1;
	}
	show(x2);//输出第一行 
	show(x4);//输出第二行 
	x6=add(x2,x4);
	show(x6);//输出加 
	x1=divide(x2,x4);
	if(sign)
	{
		x1.sb=(int)x1.sb;
		x1.xb=(int)x1.xb;
	}
	show(x1);//输出除 
	cout<<judge(x2,x4);//输出比较 
    return 0;
}
~~~

效果展示:  

 欢迎大家随时指正,提出宝贵的意见。*~*

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值