双指针从后往前计算,注意需要记录加数的小数点位置一对齐小数点。



#include<bits/stdc++.h>
using namespace std;
int main(){
    string a, b, res;
    int ap = 0, bp = 0;//分别记录a b小数点的位置
    int i, j;//双指针遍历
    int car = 0;//进位
    while(cin >> a >> b){
        //记录a b小数点的位置
        for(int i = 0; i < a.size(); i++)
            if(a[i] == '.'){
                ap = i;
                break;
            }
        for(int i = 0; i < b.size(); i++)
            if(b[i] == '.'){
                bp = i;
                break;
            }
        //从后往前计算
        i = a.size()-1;
        j = b.size()-1;
        res = "";
        car = 0;
        while(i >= 0 || j >= 0){
            if(i == ap && j == bp){//小数点
                res = '.' + res;
                i--;
                j--;
            }else if(i > ap && i-ap > j-bp){//a小数部分更长
                res = a[i] + res;
                i--;
            }else if(i > ap && i-ap < j-bp){//b小数部分更长
                res = b[j] + res;
                j--;
            }else{//整数部分
                if(i < 0){//a遍历完了 b还没有
                    res = to_string((b[j]-'0' + car) % 10) + res;
                    car = (b[j]-'0' + car) / 10;
                    j--;
                }else if(j < 0){//b遍历完了 a还没有
                    res = to_string((a[i]-'0' + car) % 10) + res;
                    car = (a[i]-'0' + car) / 10;
                    i--;
                }else{//a b都没遍历完
                    res = to_string((a[i]-'0' + b[j]-'0' + car) % 10) + res;
                    car = (a[i]-'0' + b[j]-'0' + car) / 10;//更新进位
                    i--;
                    j--;
                }
            }
        }
        cout << res << endl;
    }
    return 0;
}