#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
class Complex {
public:
Complex (int r=0, int i=0) : m_r (r), m_i (i) {}
const Complex operator+ (const Complex& c) const
{
return Complex (m_r + c.m_r, m_i + c.m_i);
}
void print (void) const
{
if(m_i == 0)
cout << m_r;
else if(m_i == 1 && m_r == 0)
cout << 'i';
else if(m_i == -1 && m_r == 0)
cout<< '-' << 'i';
else if(m_r != 0 && m_i == 1)
cout << m_r << '+' << 'i';
else if(m_r != 0 && m_i == -1)
cout << m_r << '-' << 'i';
else if(m_r != 0 && m_i > 1)
cout << m_r << '+' << m_i << 'i';
}
private:
int m_r; // 实部
int m_i; // 虚部
};
void fun(string s,int &r,int &i)
{
int j;
r = i = 0;
char buf[256];
int len = s.length();
int signPos = -1, // +/-号位置
iPos = -1; // 结尾的i的位置
for (j = len-1; j >-1; j--)
{
if ('i' == s[j])
iPos = j;
else if ('+' == s[j] || '-' == s[j])
{
signPos = j;
break;
}
}
if (0 == iPos) // 纯虚数i
{
r = 0;
i = 1;
}
else if (0 < iPos) // 复数
{
// 实部
if (0 < signPos)
{
for(j = 0;j < signPos;++j)
{
r = r*10 + s[j] - '0';
}
}
// 虚部
if (signPos + 1 == iPos) // 虚数部分 = -i / +i
i = '+' == s[signPos] ? 1 : -1;
else
{
for(j = signPos+1;j < len-1;++j)
{
i = i*10 + s[j] - '0';
}
}
}
else // 纯实数
{
for(j = 0;j < len;++j)
{
r = r*10 + s[j] - '0';
}
}
/* for(j = 0;j < len;++j)
{
if(s[j] == '+')
break;
r = r*10 + s[j] - '0';
}
for(++j;j < len;++j)
{
if(s[j] == 'i')
{
if(i == 0)
i = 1;
break;
}
i = i*10 + s[j] - '0';
}
*/
}
int main ()
{
int r,i;
string s;
cin >> s;
fun(s,r,i);
Complex t(r,i);
while(true)
{
cin >> s;
if(s == "0")
break;
fun(s,r,i);
Complex c1(r,i);
t = t+c1;
}
t.print();
return 0;
}
运算符重载-复数的加法
最新推荐文章于 2025-01-03 21:11:30 发布