// 求整数部分不补零的方法(vector<char>/string前置补零时间复杂度高)
#include <iostream>
#include <string>
using namespace std;
// 获取整数部分
string getInteger(string a) {
return a.substr(0, a.find("."));
}
// 获取小数部分
string getFraction(string a) {
return a.substr(a.find(".") + 1, a.size() - a.find("."));
}
// 当需要返回多个值时。使用引用参数 返回信息
void fractionPlus(string& res, int& carry, string fa, string fb) {
int size = max(fa.size(), fb.size());
while (fa.size() < size) {
fa.push_back('0'); // 补0
}
while (fb.size() < size) {
fb.push_back('0'); // 补0
}
res.resize(size);
carry = 0;
for (int i = size - 1; i >= 0; i--) {
if (fa[i] + fb[i] - '0' + carry > '9') { // 有进位
res[i] = fa[i] + fb[i] - '0' + carry - 10; // 取余数 -10
carry = 1;
}
else { // 无进位
res[i] = fa[i] + fb[i] - '0' + carry;
carry = 0;
}
}
return; //要不要无所谓,void 不用返回
}
void integerPlus(string& res, int carry, string ia, string ib) {
// !!! carry = 1。 a访问完,b访问完,carry=1也要进循环内
for (int i = ia.size() - 1, j = ib.size() - 1;
i >= 0 || j >= 0 || carry == 1;
i--,j--) { // a没访问完 || b没访问完 || 进位为1(a="99" b="11"最高位进位情况) 进入循环
if (i >= 0 && j >= 0) { // a没访问完 + b没访问完
if (ia[i] + ib[j] + carry - '0' > '9') { //访问ib 用j
// !!! 下面是错误的,res没申请空间,不能直接访问。用res.resize(n);申请
// res[i] = ia[i] + ib[i] + carry - '0' - 10; // 取余
// 用取余 插入(后续情况类似)
res.insert(res.begin(), ia[i] + ib[j] + carry - '0' - 10) ;
carry = 1;
}
else {
res.insert(res.begin(), ia[i] + ib[j] + carry - '0');
carry = 0;
}
}
else if(i >= 0 && j < 0) { // a没访问完,b访问完了 a='99' b='1'
// ib[i] 当0
if (ia[i] + carry > '9') { // 单独访问一个ia/ib不用 -'0',默认其中一个为0,不加
res.insert(res.begin(), ia[i] + carry - 10); // 取余
carry = 1;
}
else {
res.insert(res.begin(), ia[i] + carry);
carry = 0;
}
}
else if (i < 0 && j >= 0) { // a访问完了,b没访问完 a='1' b='99'
// ia[i] 当0
if (ib[j] + carry > '9') { // 单独访问一个ia/ib不用 -'0',默认其中一个为0,不加
res.insert(res.begin(), ib[j] + carry - 10); // 取余
carry = 1;
}
else {
res.insert(res.begin(), ib[j] + carry);
carry = 0;
}
}
else { // a,b都访问完了,但是最高位有进位 a='99' b='10'
res.insert(res.begin(),'1'); // 最高位补1
}
}
return; //要不要无所谓,void 不用返回
}
int main() {
char arra[1000] = { 0 }; // 初始化
char arrb[1000] = { 0 };
while (scanf("%s%s",arra,arrb) != EOF) { //没结束
string a = arra;
string b = arrb;
string ia = getInteger(a);
string ib = getInteger(b);
string fa = getFraction(a);
string fb = getFraction(b);
string fres; // 小数部分结果
int carry;
fractionPlus(fres, carry, fa, fb);
string ires; // 整数部分结果
integerPlus(ires, carry, ia, ib);
// string 输出用.c_str()方法
printf("%s.%s",ires.c_str(), fres.c_str());
}
return 0;
}