按照计算机组成原理的知识,整一个sum函数作为加法器即可
用inputCarry和outputCarry来传递进位
然后将两个字符串的整数、小数部分各自对齐,各自使用sum函数
#include<iostream> #include<string> using namespace std; void paddingLeft(string &s,int num){ if(s.size()==num) return; int padding = num-s.size(); for(int i=0;i<padding;i++) s="0"+s; } void paddingRight(string &s,int num){ if(s.size()==num) return; int padding = num-s.size(); for(int i=0;i<padding;i++) s+="0"; } string sum(string a,string b,int &outputCarry,int inputCarry=0){ string::reverse_iterator it1 = a.rbegin(); string::reverse_iterator it2 = b.rbegin(); string ans = ""; int carry = inputCarry; while(it1!=a.rend()){//已经对齐过了反正 int sum = (*it1-'0')+(*it2-'0')+carry; //计算本位并拼接字符串 int remain = sum%10; char digit = '0'+remain; ans = digit+ans; //进位到下一位 carry = sum/10; it1++; it2++; } outputCarry = carry; return ans; } int main(){ string a,b; while(cin>>a>>b){ //提取整数/小数部分 string aU = a.substr(0,a.find('.')); string aL = a.substr(a.find('.')+1); string bU = b.substr(0,b.find('.')); string bL = b.substr(b.find('.')+1); //对齐 int dU = aU.size()>=bU.size()?aU.size():bU.size(); int dL = aL.size()>=bL.size()?aL.size():bL.size(); paddingRight(aL,dL); paddingRight(bL,dL); paddingLeft(aU,dU); paddingLeft(bU,dU); //计算 int cL=0;//小数部分进位 int cU=0;//整数部分进位 string sL = sum(aL,bL,cL); string sU = sum(aU,bU,cU,cL); if(cU==1) sU = '1'+sU; //输出 cout<<sU<<'.'<<sL<<endl; } return 0; }