题目描述
请你创建一个复数类,在本题中要求解决复数类的求和问题。
做本题之前,最好先完成同系列题目《复数类1》,本题的复数输入输出要求与其相同。
输入格式:
第—行输入一个整数n, n表示数据组数。
接下来n行,每行输入一个复数(以类似“a+bi”的格式输入,但不一定最简,可能会有多个项,输入的项的系数是浮点数)。
输出格式:
输出一行一个最简复数,为输入的n个复数的总和。
按题目描述中“最简情况”输出读入得到的复数,浮点数用cout或
printf("%g”)输出。
保证:对于100%的数据:
1
<
=
n
<
=
100
,
000
1<=n<=100,000
1<=n<=100,000,每行输入非空字符串长度不超过1000,输入的浮点数最多精确到小数点后两位。
输入样例
8
123
0i
i
i+3
3-i
7.6+1i
76.7-0.66i
3i+7i+8i+9+0+03.67i+10
输出样例
232.3+23.01i
分析
在执行取数操作前,需要将每一项都给分离出来,可以用’+‘作为分解的标志位,所以我们需要给每个‘-’前面加一个’+'方便提取操作。
之后将每个提取出来的数据进行
s
t
o
d
(
s
t
r
)
stod(str)
stod(str)操作将字符串转换为double数据加入到答案中。
代码可过9个样例。
C++代码
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#pragma G++ optimize(2)
using namespace std;
string s;
int n;
double shi,fu;
int main()
{
cin>>n;
getchar();
while(n--)
{
cin>>s;
string t="";
for(int i=0;i<s.size();i++)
{
if(s[i]=='-')
{
t+='+';
}
t+=s[i];
}
s='+'+t+'+';
for(int i=0;i<s.size();i++)
{
if(s[i]=='+')
{
int j=i+1;
while(j<s.size() && s[j]!='+')
{
j++;
}
auto temp=s.substr(i+1,j-i-1);
if(temp.size())
{//cout<<temp<<endl;
if(s[j-1]=='i'){
temp.pop_back();
if(temp.size()){
if(temp.size()==1 && temp[0]=='-'){
temp="-1";
fu+=stod(temp);
}
else fu+=stod(temp);
}
else{
temp="1";
fu+=stod(temp);
}
}
else{
shi+=stod(temp);
}
}
i=j-1;
}
}
}
//复数和实数都为0
if(!shi && !fu){
cout<<0;
return 0;
}
if(shi) cout<<shi;
if(fu){
if(fu>0 && shi) cout<<"+";
if(fu!=1 && fu!=-1) cout<<fu<<"i";
else if(fu==1) cout<<"i";
else cout<<"-i";
}
return 0;
}
9944

被折叠的 条评论
为什么被折叠?



