双指针从后往前计算,注意需要记录加数的小数点位置一对齐小数点。
#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;
}