题目描述
请你创建一个复数类,在本题中要求实现复数类的读入和输出。
本题测试数据中,读入时不一定是最简(行首正实数前面可能有”+”号),但输出时要求最简。
最简情况是:实数直接表示,虚数以“a+bi”(其中“+”号也可能是“-”号,且a若为0则不显示,b若为1则不显示,基本和书面写法一样,可参考样例)的格式表示。
输入格式:
第—行输入一个整数n, n表示数据组数。
接下来n行,每行输入一个复数(以类似“a+bi”的格式输入,但不一定最简,可能会有多个项,输入的项的系数是浮点数)。
输出格式:
输出n行,按题目描述中“最简情况”输出读入得到的复数,浮点数用cout或
printf("%g”)输出。
输入样例
8
123
0i
i
i+3
3-i
7.6+1i
76.7-0.66i
3i+7i+8i+9+0+03.67i+10
输出样例
123
0
i
3+i
3-i
7.6+i
76.7-0.66i
19+21.67i
分析
在执行取数操作前,需要将每一项都给分离出来,可以用’+‘作为分解的标志位,所以我们需要给每个‘-’前面加一个’+'方便提取操作。
之后将每个提取出来的数据进行stod(str)stod(str)stod(str)操作将字符串转换为double数据加入到答案中。
代码可过8个样例。
C++代码
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#pragma G++ optimize(2)
using namespace std;
int n;
int main()
{
cin>>n;
while(n--)
{
double shi=0,fu=0;
string s;
cin>>s;
string t="";
for(int i=0;i<s.size();i++)
{
//给负号前面加一个加号,方便一会的提取操作
if(s[i]=='-')
{
t+='+';
}
t+=s[i];
}
s='+'+t+'+';
//cout<<s<<endl;
//提取出加号之间的真实数据
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())
{
//如果是复数
if(s[j-1]=='i'){
//将尾部的i去掉
temp.pop_back();
if(temp.size()){
if(temp.size()==1 && temp[0]=='-'){
//对应-i这种情况
temp="-1";
fu+=stod(temp);
}
else fu+=stod(temp);
}
else{
//对应i这种情况
temp="1";
fu+=stod(temp);
}
}
else{ //实数的话直接加到答案中
shi+=stod(temp);
}
}
i=j-1;
}
}
//实数复数都为0
if(!shi && !fu){
cout<<0<<endl;
continue;
}
if(shi) cout<<shi;
if(fu){
if(fu>0 && shi) cout<<"+";
//复数有i,-i的特殊情况
if(fu!=1 && fu!=-1) cout<<fu<<"i";
else if(fu==1) cout<<"i";
else cout<<"-i";
}
cout<<endl;
}
return 0;
}
本文介绍了一个简单的复数类实现,包括复数的读入与输出功能,并通过示例展示了如何处理不同形式的复数输入,使之符合最简格式。
492

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



