小数的高精度加法
直接上代码吧。只支持正数的高精度加法,支持小数和整数互加也支持整数+整数,小数+小数。
#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; }