题目描述
读入两个字符串,字符串除了数字还可能包括 '—'、'E'、'e'、'.',相加之后输出结果,如果是浮点型,要求用科学计数法表示(最多包含10个有效数字)。
输入
输入包含多组测试数据。
每组输入占两行,每行一个字符串,测试数据保证字符串的构成严格按照题目中的描述。
输出
输出两个数字相加的结果,每组输出占一行。
样例输入
34.56 2.45e2
样例输出
2.7956e2
答案错误50%
#include<stdio.h>
#include<string>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
/*
- :为负数
E/e:为10的多少次方
. :为小数
*/
string change(string s, int &e)
{
int k=0;
while(k<s.length()&&s[k]!='.')
k++;
if(k < s.length())//有小数点
{
s.erase(s.begin()+k);
while(k<s.length())
{
k++;
e--;
}
}
return s;
}
int check(string &s)
{
if(s[0]=='-')
{
s.erase(s.begin());
return -1;
}
return 1;
}
string deal_e(string s, int &e)
{
int k=0, fh=1;
while(s.length()>0&&(s[k]!='e'&&s[k]!='E'))
k++;
//去掉e
if(k<s.length())
{
int index = k;
s.erase(s.begin()+k);
if(s[k]=='-')
{
fh = -1;
s.erase(s.begin()+k);
}
while(k<s.length())
{
e = e*10+s[k]-'0';
k++;
}
s.erase(s.begin()+index, s.end());
//s.erase(s.begin()+k, );
}
e*=fh;
return s;
}
string ty(string s, int &e, int minn)
{
while(e>minn)
{
s+='0';
e--;
}
return s;
}
long long int change_n(string s)
{
int n = 0, k=0;
while(k<s.length())
{
n = n*10+s[k]-'0';
k++;
}
return n;
}
int main()
{
string s1, s2, s3, s4, s5,s6;
while(cin>>s1>>s2)
{
int f1=1, f2=1, e1=0, e2=0;
f1 = check(s1);//记录符号
f2 = check(s2);
s3 = deal_e(s1, e1);//去掉e
s4 = deal_e(s2, e2);
s5 = change(s3, e1);
s6 = change(s4, e2);
int minn = min(e1, e2);//向小的看齐
s5 = ty(s5, e1, minn);
s6 = ty(s6, e2, minn);
long long int n1, n2;
n1 = change_n(s5);
n2 = change_n(s6);
//cout<<n1<<" "<<f1<<" "<<n2<<" "<<f2<<endl;
long long int sum = n1*(f1)+n2*(f2);
long long int temp = sum;
int k=0;
while(temp)
{
temp/=10;
k++;
}
long long int m = 1;
for(int i=1; i<=(k-1); i++)
m*=10;
cout<< sum/m<<"."<< abs(sum % m);
e1 = e1 + (k-1);
if(e1!=0)
{
cout<<"e"<<e1<<endl;
}
}
}