小数的高精度加法

直接上代码吧。只支持正数的高精度加法,支持小数和整数互加也支持整数+整数,小数+小数。

#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;
}

 

posted @ 2016-11-06 22:33  ghj1222  阅读(335)  评论(0编辑  收藏  举报