#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
//这一题真难,不过写出来真有成就感
int main() {
string a, b;
cin >> a;
cin >> b;
//先处理字符串
int dot = a.find('.');
int dot2 = b.find('.');//找两个串小数点·的下标
int cha = dot - dot2;//小数点.前短的串需要补0
if (cha > 0) {//说明a长b短
b.insert(0, cha, '0');//b前插差值个0
} else {//说明a短b长
cha = dot2 - dot;
a.insert(0, cha, '0');//a前插0
}
if (a.size() < b.size()) { //b长于a则交换,保证a为长串
a.swap(b);
}
b.insert(b.size(), a.size() - b.size(), '0');//在短串b后插入ab长度差个0
//先补齐较短一方的长度
//再进行运算
int carry = 0;//存储进位位
dot = dot > dot2 ? dot : dot2;//dot为较长子串的小数点,即为处理后的串公共的小数点
for (int i = a.length() - 1; i > dot ; i--) {//从后往前加
int result = (a[i] - '0' + b[i] - '0' + carry) % 10 + '0';//计算机相加之后的本位数并%10
carry = (a[i] - '0' + b[i] - '0' + carry) / 10;//计算进位位,结果为0/1
a[i] = result ;
}
for (int i = dot - 1; i >= 0; i--) {//往小数点.前继续加,不要忘了上一步循环最后的进位carry
int result = (a[i] - '0' + b[i] - '0' + carry) % 10 + '0';
carry = (a[i] + b[i] - '0' - '0' + carry) / 10;
a[i] = result ;
}
//如果最高位还有进位那么必为1,在结果串a最前面插1即可
if (carry = 1) {
int result = (a[0] - '0' + b[0] - '0' + carry) % 10;
string s;
s[0] = (result + '0');
a.insert(0, s);
cout << a << endl;
}
}
// 64 位输出请用 printf("%lld")