问题描述
本题要求编写程序,计算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;
}