直接上代码吧。只支持正数的高精度加法,支持小数和整数互加也支持整数+整数,小数+小数。
#include <iostream>
#include <string>
#include <stack>
using namespace std;
string jia(string a,string b)
{
string ans;
stack<int>left,dot;
string::iterator pa,pb,i,j;
bool jw=false,right=false,point=false;
int ca=0,cb=0;
for(i=a.begin();i!=a.end();i++)//处理A是整数
if(*i=='.')
{
point=true;
break;
}
if(point!=true)//如果A是整数就加上.0变成小数
{
a.push_back('.');
a.push_back('0');
}
point=false;
for(j=b.begin();j!=b.end();j++)//处理B是整数
if(*j=='.')
{
point=true;
break;
}
if(point!=true)//如果B是整数就加上.0变成小数
{
b.push_back('.');
b.push_back('0');
}
for(pa=a.begin();pa!=a.end();++pa,++ca)//寻找小数点
if(*pa=='.')
break;
for(pb=b.begin();pb!=b.end();++pb,++cb)//寻找小数点
if(*pb=='.')
break;
for(i=pa+1,j=pb+1;i!=a.end()&&j!=b.end();++i,++j);//计算有多少位
if(i==a.end()&&j!=b.end())//如果i到头了但是j没到头(b小数点后比a长,a补位)
while(a.length()-ca!=b.length()-cb)
a.push_back('0');
if(i!=a.end()&&j==b.end())//如果i没到头但是j到头了(a小数点后比b长,b补位)
while(a.length()-ca!=b.length()-cb)
b.push_back('0');
/*注意:由于string的一种玄学,这里要重新找一次小数点。*/
for(pa=a.begin();pa!=a.end();++pa,++ca)//寻找小数点
if(*pa=='.')
break;
for(pb=b.begin();pb!=b.end();++pb,++cb)//寻找小数点
if(*pb=='.')
break;
for(i=a.begin();i!=a.end();++i)//将字符转换成数字
if(*i!='.')
(*i)-=48;
for(j=b.begin();j!=b.end();++j)//将字符转换成数字
if(*j!='.')
(*j)-=48;
for(i=a.end()-1,j=b.end()-1;i!=pa&&j!=pb;i--,j--)//小数点之后的计算
{
if((*i+*j+jw)%10!=0||right)
{
dot.push((*i+*j+jw)%10);
right=true;
}
jw=(*i+*j+jw)/10;
}
for(i=pa-1,j=pb-1;i!=a.begin()-1&&j!=b.begin()-1;i--,j--)//小数点之前的计算
{
left.push((*i+*j+jw)%10);
jw=((*i+*j+jw)/10);
}
if(i==a.begin()-1&&j!=b.begin()-1)//对于b的整数部分比a长的情况
for(;j!=b.begin()-1;j--)
{
left.push((*j+jw)%10);
jw=(*j+jw)/10;
}
if(i!=a.begin()-1&&j==b.begin()-1)//对于a的整数部分比b长的情况
for(;i!=a.begin()-1;i--)
{
left.push((*i+jw)%10);
jw=(*i+jw)/10;
}
if(jw!=0)left.push(1);//对于计算完毕仍然有进位的情况
while(!left.empty())//操作整数栈
{
ans.push_back(left.top()+48);
left.pop();
}
if(right)//小数点
ans.push_back('.');
while(!dot.empty())//小数栈
{
ans.push_back(dot.top()+48);
dot.pop();
}
return ans;//返回结果
}
int main()
{
string a,b;
cin >> a >> b;
cout << jia(a,b) << endl;
return 0;
}