#include <iostream>
#include <vector>
using namespace std;
/**
参考acwing:acwing.com/problem/content/submission/code_detail/21333150/
*/
void cmp(string &r1, string &r2){//小数部分末尾补0对其
if(r1.length() < r2.length()) r1.insert(r1.length(), r2.length()-r1.length(), '0');
else if(r2.length() < r1.length()) r2.insert(r2.length(), r1.length()-r2.length(), '0');
}
//小数部分求和
vector<int> add_right(vector<int> &v1, vector<int> &v2, int &up){
vector<int> v3;
int t = 0;//进位
for(int i = 0; i < v1.size(); i ++){
t += v1[i] + v2[i];
v3.push_back(t % 10);
t /= 10;//更新进位
}
up = t;//up存放小数部分向整数部分的进位
return v3;
}
//整数部分求和
vector<int> add_left(vector<int> &v1, vector<int> &v2, int down){//down表示小数向整数的进位
if(v1.size() < v2.size())
return add_left(v2, v1, down);
vector<int> v3;
int t = down;
for(int i = 0; i < v1.size(); i ++){//保证v1的长度大于v2
t += v1[i];
if(i < v2.size())
t += v2[i];
v3.push_back(t % 10);
t /= 10;
}
if(t != 0)//最高位进位
v3.push_back(t);
return v3;
}
int main() {
string a, b;
cin >> a >> b;
string al, ar, bl, br;
//al、ar分别为第一个浮点数的整数部分、小数部分
al = a.substr(0, a.find('.'));
ar = a.substr(a.find('.') + 1);
//bl、br同理
bl = b.substr(0, b.find('.'));
br = b.substr(b.find('.') + 1);
vector<int> a1, a2, b1, b2;
cmp(ar, br);
//逆序存放,即vector低下标存放低位,相加时先计算低位
for(int i = al.size()-1; i >= 0; i --) a1.push_back(al[i]-'0');
for(int i = ar.size()-1; i >= 0; i --) a2.push_back(ar[i]-'0');
for(int i = bl.size()-1; i >= 0; i --) b1.push_back(bl[i]-'0');
for(int i = br.size()-1; i >= 0; i --) b2.push_back(br[i]-'0');
int t;
vector<int> res_right = add_right(a2, b2, t);//t用于传递小数向整数部分的进位
vector<int> res_left = add_left(a1, b1, t);
//注意要倒序输出,因为小数部分和整数部分都是从低位开始相加,即从右往左开始计算的,结果的vector中,低下标存放的是低位,应该先输出高位
for(int i = res_left.size()-1; i >= 0; i --) cout << res_left[i];
cout << '.';
for(int i = res_right.size()-1; i >= 0; i --) cout << res_right[i];
return 0;
}
// 64 位输出请用 printf("%lld")