题目:一个复数类,运算符重载 + ,实现复数和复数的相加。输入一组复数,每行一个复数,直到输入0结束。 输出这组复数的结果。
提示: 复数的输入和输出符合数学书写规范
输入示例
3+2i
2+3i
0
输出示例
5+5i
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
double r=0,im=0;
while(1)
{
cin>>str;
if(str[0]=='0') break;
int len,i=0,t=1;
int zheng=0,fu=0,xui=0;
double real=0,imag=0;
len=str.length();
for(i=0;i<len;i++)
{
if(str[i]=='+') zheng++;
if(str[i]=='-') fu++;
if(str[i]=='i') xui++;
}
if((zheng==1&&xui==1)||(fu==1&&zheng==1&&xui==1)||(fu==2&&xui==1)||(fu==1&&xui==1&&(str[0]>='0'&&str[0]<='9')))// //情况:实部与虚部都存在
{
i=0;
t=1;
while(str[i]<'0'||str[i]>'9') i++;
while(str[i]>='0'&&str[i]<='9'&&i<len)//计算实部
{
real=real*t+(str[i]-'0');
t=t*10;
i++;
}
char ch=str[i];//实部与虚部之间运算符号
i++;
if(str[i]=='i') imag=1;
else
{
t=1;
while(str[i]>='0'&&str[i]<='9'&&i<len)//计算虚部
{
imag=imag*t+(str[i]-'0');
t=t*10;
i++;
}
}
if(str[0]=='-') real=-1*real;
if(ch=='-') imag=-1*imag;
}
else if(xui==0)//只有实部
{
i=0;
t=1;
while(str[i]<'0'||str[i]>'9') i++;
while(str[i]>='0'&&str[i]<='9'&&i<len)//计算实部
{
real=real*t+(str[i]-'0');
t=t*10;
i++;
}
if(str[0]=='-') real=-1*real;
imag=0;
}
else if((xui==1&&zheng==0&&fu==0)||(xui==1&&fu==1&&str[0]=='-'))//只有虚部
{
i=0;
t=1;
if(str[0]=='i') imag=1;
else if(str[0]=='-'&&str[1]=='i') imag=-1;
else
{
while(str[i]<'0'||str[i]>'9') i++;
while(str[i]>='0'&&str[i]<='9'&&i<len)//计算实部
{
imag=imag*t+(str[i]-'0');
t=t*10;
i++;
}
if(str[0]=='-') imag=-1*imag;
}
real=0;
}
r=r+real;
im=im+imag;
}
if(r==0&&im==0) cout<<"0"<<endl;
else if(r==0&&im!=0&&im!=1) cout<<im<<"i"<<endl;
else if(r==0&&im!=0&&im==1) cout<<"i"<<endl;
else if(r==0&&im!=0&&im==-1) cout<<"-i"<<endl;
else if(r!=0&&im==0) cout<<r<<endl;
else if(r!=0&&im>0&&im!=1) cout<<r<<"+"<<im<<"i"<<endl;
else if(r!=0&&im>0&&im==1) cout<<r<<"+"<<"i"<<endl;
else if(r!=0&&im<0&&im==-1) cout<<r<<"-"<<"i"<<endl;
else cout<<r<<im<<"i"<<endl;
return 0;
}