开始时错在了99.15 0.15这样的数据上,发现后就A了。
#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string add(string st1,string st2)
{
if(st1.size()<=st2.size())
{
string s=st1;
st1=st2;
st2=s;
}
reverse(st1.begin(),st1.end()); //将string类st1,st2逆转顺序
reverse(st2.begin(),st2.end());
int len1,len2;
len1=st1.length(); //计算各自的长度
len2=st2.length();
int in=0,num; //进位in初始化为0
for(int i=0; i<len2; i++)
{
num=st1[i]-'0'+st2[i]-'0'+in; //各位的和
in=num/10;
num%=10;
st1[i]=num+'0'; //放入较长的string里
}
for(int j=len2; j<len1; j++) //如果遇到例如123 99892这样的样例,123处理完后需要向前边进位
{
num=st1[j]-'0'+in;
in=num/10;
num%=10;
st1[j]=num+'0';
}
if(in==1) //相加的结果比原有的string都长
{
st1+="1";
}
reverse(st1.begin(),st1.end());
return st1;
}
string flo_add(string st1,string st2)
{
string prest1,prest2,sufst1,sufst2,prest,sufst;
int len1,len2,k;
len1=st1.length();
len2=st2.length();
for( k=0; k<len1; k++) //获取小数点前后的值
{
if(st1[k]=='.')
break;
prest1+=st1[k];
}
for(int j=k+1; j<len1; j++)
sufst1+=st1[j];
for( k=0; k<len2; k++)
{
if(st2[k]=='.')
break;
prest2+=st2[k];
}
for(int j=k+1; j<len2; j++)
sufst2+=st2[j];
int lmax,lmin,flag;
if(sufst1.length()>=sufst2.length()) //小数部分补零对齐
{
lmax=sufst1.length();
lmin=sufst2.length();
flag=1;
}
else
{
lmax=sufst2.length();
lmin=sufst1.length();
flag=2;
}
for(int i=lmin; i<lmax; i++)
{
if(flag==1)
sufst2+='0';
else
sufst1+='0';
}
reverse(sufst1.begin(),sufst1.end()); //小数部分相加
reverse(sufst2.begin(),sufst2.end());
len1=sufst1.length();
int in=0,num;
for(int i=0; i<len1; i++)
{
num=sufst1[i]-'0'+sufst2[i]-'0'+in;
in=num/10;
num%=10;
sufst+=num+'0';
}
reverse(sufst.begin(),sufst.end());
prest=add(prest1,prest2);
string s;
s+=in+'0';
prest=add(prest,s); //加上小数部分的进位 解决432.2736 67.873这样的数值
s=prest;
s+='.';
s+=sufst;
reverse(s.begin(),s.end());
int ll=s.size();
string ans;
bool FLAG=false;
for(int q=0; q<ll; q++)<span style="white-space:pre"> </span>//做最简结果处理
{
if(s[q]=='.'&&!FLAG)
{
FLAG=1;
continue;
}
if(s[q]!='0')
{
FLAG=1;
}
if(FLAG)
{
ans+=s[q];
}
}
reverse(ans.begin(),ans.end());
return ans;
// return s;
}
int main()
{
// freopen("INput.txt","r",stdin);
// freopen("OUT.txt","w",stdout);
string str1,str2;
while( cin>>str1>>str2)
{
cout<<flo_add(str1,str2)<<endl;
}
return 0;
}