建立一个复数类Complex,实数和虚数是其私有数据成员;
建立复数类的无参和参数化构造函数;
建立一个 *(乘号)的运算符重载,以便于对两个复数直接进行乘法运算;
建立输出函数void display(),对复数进行输出;
主函数里定义三个复数类对象c1、c2、c3.
输入格式:
输入一共一行,每行两个复数,分别为复数类c1和c2。
输出格式:
执行c3=c1*c2运算之后,调用display函数,对c3进行输出。
提示:输入或输出的复数,可能只包含实部或虚部。
输入样例:
1+2i 2+3i
输出样例:
-4+7i
这一题上机的时候没想好怎么做,忘记了正负,然后又想到复数的简化形式,判断起来很难,没想清楚就下了手,导致花了一个多小时没做出来,然后今天补救,有了之前的经验,仔细想了想,其实可以前来一次前缀处理,去掉特殊情形,再做成函数,这样就快很多
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class Complex
{
private:
int imag;
int real;
public:
Complex(int r = 0, int i = 0):real(r),imag(i) {}
void display();
Complex operator *(Complex &t);
};
Complex Complex::operator *(Complex &t)
{
return Complex((real*t.real - imag*t.imag),(real*t.imag + imag*t.real));
}
void Complex::display()
{
if (imag && real)
{
printf("%d",real);
if(imag == 1) printf("+i
");
else if (imag == -1) printf("-i
");
else if (imag > 0) printf("+%di
",imag);
else printf("%di
",imag);
}
else if(real != 0)
{
printf("%d
",real);
}
else if(imag != 0)
{
if(imag == 1) printf("i
");
else if (imag == -1) printf("-i
");
else printf("%di
",imag);
}
}
int ll;
int change(char *s,int l)
{
int ans = 0;
while (s[l]>='0' && s[l] <= '9')
{
ans = ans*10 + s[l++] - '0';
}
ll = l;
return ans;
}
Complex f(char *s)
{
int n = strlen(s);
int real = 0,imag = 0;
if(s[n-1] == 'i')//存在虚部
{
int flag = -1;
int n = strlen(s);
int t = 0;
if(s[0] == '-') t = 1;
for (int i = t; i < n; i++)
{
if(s[i] == '+' || s[i] == '-')
{
flag = i;//存在实部;
break;
}
}
if(flag != -1)//有实部有虚部
{
if(s[0] == '-') real = -1 * change(s,1);
else real = change(s,0);
if(s[flag] == '-') imag = -1*change(s,flag+1);
else imag = change(s,flag+1);
}
else//只有虚部
{
if(s[0] == '-') imag = -1 * change(s,1);
else imag = change(s,0);
}
}
else//只有实部;
{
if(s[0] == '-') real = -1*change(s,1);
else real = change(s,0);
}
return Complex(real,imag);
}
int main()
{
char s1[100] = "";
char s2[100] = "";
scanf("%s %s",s1,s2);
int n = strlen(s1);
if(s1[n-1] == 'i' &&(n == 1 || s1[n-2] == '+'|| s1[n-2] == '-'))//处理特殊情形
{
s1[n-1] = '1';
s1[n] = 'i';
}
Complex c1 = f(s1);
n = strlen(s2);
if(s2[n-1] == 'i' &&(n == 1 || s2[n-2] == '+'|| s2[n-2] == '-'))
{
s2[n-1] = '1';
s2[n] = 'i';
}
Complex c2 = f(s2);
Complex c3 = c1*c2;
c3.display();
}