按照计算机组成原理的知识,整一个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;
}