/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//变态
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cstdio>
#include <string>
// #include <cstring>
using namespace std;
const int MAXSIZE = 100; //就是这儿,你一开始设置小点,运算快,之后别忘了改过来嘛#1
int main()
{
string str1;
string str2;
// string str3; //就是不知道为啥数组不能用#2
int arr3[MAXSIZE];
int m;
int n;
while(cin>>str1)
{
cin>>str2;
for(int i=0; i<str1.size(); ++i)
{
if(str1[i]=='.') //得区分小数点前和小数点后,小数点后补零对齐#3
{
m=i;
break;
}
}
for(int i=0; i<str2.size(); ++i)
{
if(str2[i]=='.')
{
n=i;
break;
}
}
int diff=str1.size()-str2.size()-m+n; //给小数点后短的补零#6
if(diff>0)
{
for(int i=0; i<diff; ++i) //这里必须提前确定好范围,要不str越加越长#4
{
str2+="0"; //拼接得是字符串,得用双引号“”#5
}
}
else
{
for(int i=0; i<-diff; ++i)
{
str1+="0";
}
}
int p=str1.size()-1; //str1从最右到左的序号#7
int q=str2.size()-1; //str2从最右到左的序号#8
int k=0; //进位#9
int i=0;
while(p>=0&&q>=0) //有一个算完了退出来#10
{
if(str1[p]!='.') //要是碰到小数点得留一个小数点的位置#11
{
// str3[i]=((str1[p]-'0')+(str2[q]-'0'))%10+k+'0'; //反正就是不知道字符串str3为什么不行#12
arr3[i]=((str1[p]-'0')+(str2[q]-'0')+k)%10; //求余数,余数就是这个位的值#13
if(str1[p]+str2[q]-'0'-'0'+k>=10) //大于10就进位#14
{
k=1;
}
else
{
k=0;
}
}
else
{
arr3[i]=-1;
// str3[i]='.';
}
--p; //这种东西最麻烦了#15
--q;
++i;
}
if(p==-1) //把多余的补上#16
{
while(q>=0)
{
arr3[i]=str2[q]-'0'+k; //刚才的进位也得加上#17
k=0; //就很烦,每次都得加一遍,所以设为0#18
// str3+=str2[q];
q--;
i++;
}
}
else
{
while(p>=0)
{
arr3[i]=str1[p]-'0'+k;
k=0;
i++;
// str3+=str1[p];
p--;
}
}
for(i=i-1; i>=0; --i)
{
if(arr3[i]==-1) //小数点必须有#19
{
cout<<'.';
}
else
{
cout<<arr3[i];
}
// cout<<str3[i];
}
cout<<endl;
}
}