要求:
用输入的四个实数,构造两个复数(按实部,虚部序分配),并根据第一个输入的实数的小数部分是否为零,确定构造的是两个整数复数或是两个实数复数。然后分别在五行中输出:复数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;
}
~~~
效果展示:
欢迎大家随时指正,提出宝贵的意见。*~*