zoukankan      html  css  js  c++  java
  • 小数的高精度加法

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

    #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;
    }
    
  • 相关阅读:
    合并指定表格指定列的相同文本的相邻单元格
    [转载]>/dev/null 2>&1 含义
    有关cron
    jQuery版本对checkbox影响
    c# 如何获取项目的根目录
    Javascript 字符串组装用函数 format
    sql server 删除数据库
    说说接口封装
    有开放的接口!!!!
    支付宝支付功能的集成
  • 原文地址:https://www.cnblogs.com/oier/p/6036720.html
Copyright © 2011-2022 走看看