//3.1 1H AC!!!
#include<iostream>
#include<string>
using namespace std;
int aa[500],bb[500],res[500];
void sw(int list[],int n)
{//逆置
int i=0,j=n-1;//3.1 1H AC!!!
#include<iostream>
#include<string>
using namespace std;
int aa[500],bb[500],res[500];
void sw(int list[],int n)
{//逆置
int i=0,j=n-1;
for(;i<j;i++,j--)
swap(list[i],list[j]);
}
int main()
{
int n,m,i,j,k,adot,bdot,jinwei,alen,blen,clen,dot,ai,bi,ci,endi;
char a[500],b[500];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(res,0,sizeof(res));
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
while(scanf("%s %s",a,b)!=EOF)
{//先找各自的小数点
adot = -1;
alen = strlen(a);
blen = strlen(b);
for(i=0;i<alen;i++)
{
if(a[i]=='.')
{
adot = i;
break;
}
}
if(adot == -1) //统一起见,没有小数点的就加上
{
a[i] = '.';
adot = i;
alen++;
}
bdot = -1;
for(i=0;i<blen;i++)
{
if(b[i]=='.')
{
bdot = i;
break;
}
}
if(bdot == -1) //统一起见,没有小数点的就加上
{
b[i] = '.';
bdot = i;
blen++;
}
dot = (alen-adot-1>blen-bdot-1)?(alen-adot-1):(blen-bdot-1);//结果的小数点位置
adot = alen-adot-1;
bdot = blen-bdot-1;
ai=0;
if(dot >= adot)//a小数点后补零
{
for(i=0;i<alen;i++)
{
if(a[i]!='.')
{
aa[ai++] = a[i]-'0';
}
}
for(i=adot;i<dot;i++) ai++;
}
bi=0;
if(dot >= bdot)//b小数点后补零
{
for(i=0;i<blen;i++)
{
if(b[i]!='.')
{
bb[bi++] = b[i] -'0';
}
}
for(i=bdot;i<dot;i++) bi++;
}
sw(aa,ai);
sw(bb,bi);
ci = ai > bi ? ai:bi;
for(i=0;i<ci;i++)
{
res[i] += aa[i] + bb[i];
if(res[i] >= 10)
{
res[i+1] += res[i]/10;
res[i] = res[i]%10;
}
}//到此已经算初级如果,接下来输出。题目要求输出最简形式
for(i=ci+1;i>=0;i--)//i=ci+1是为了防止可能出现的最高进位
{
if(res[i]!=0) break;
}
ci = i;//去掉结果前面的零
endi=0;
for(i=0;i<=ci;i++)//i=ci+1是为了防止可能出现的最高进位
{//去掉结果小数点后面的零
if(i == dot) {endi = i; break;}
if(res[i]!=0 ) //注意可以包含到小数点(不输出小数点的情况i==dot,dot为小数点位置)!!!
{endi = i; break;}
}
for(i=ci;i>=endi;i--)
{
if(i == dot-1) printf(".");
printf("%d",res[i]);
}
printf("\n");
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(res,0,sizeof(res));
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
}
}
for(;i<j;i++,j--)
swap(list[i],list[j]);
}
int main()
{
int n,m,i,j,k,adot,bdot,jinwei,alen,blen,clen,dot,ai,bi,ci,endi;
char a[500],b[500];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(res,0,sizeof(res));
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
while(scanf("%s %s",a,b)!=EOF)
{//先找各自的小数点
adot = -1;
alen = strlen(a);
blen = strlen(b);
for(i=0;i<alen;i++)
{
if(a[i]=='.')
{
adot = i;
break;
}
}
if(adot == -1) //统一起见,没有小数点的就加上
{
a[i] = '.';
adot = i;
alen++;
}
bdot = -1;
for(i=0;i<blen;i++)
{
if(b[i]=='.')
{
bdot = i;
break;
}
}
if(bdot == -1) //统一起见,没有小数点的就加上
{
b[i] = '.';
bdot = i;
blen++;
}
dot = (alen-adot-1>blen-bdot-1)?(alen-adot-1):(blen-bdot-1);//结果的小数点位置
adot = alen-adot-1;
bdot = blen-bdot-1;
ai=0;
if(dot >= adot)//a小数点后补零
{
for(i=0;i<alen;i++)
{
if(a[i]!='.')
{
aa[ai++] = a[i]-'0';
}
}
for(i=adot;i<dot;i++) ai++;
}
bi=0;
if(dot >= bdot)//b小数点后补零
{
for(i=0;i<blen;i++)
{
if(b[i]!='.')
{
bb[bi++] = b[i] -'0';
}
}
for(i=bdot;i<dot;i++) bi++;
}
sw(aa,ai);
sw(bb,bi);
ci = ai > bi ? ai:bi;
for(i=0;i<ci;i++)
{
res[i] += aa[i] + bb[i];
if(res[i] >= 10)
{
res[i+1] += res[i]/10;
res[i] = res[i]%10;
}
}//到此已经算初级如果,接下来输出。题目要求输出最简形式
for(i=ci+1;i>=0;i--)//i=ci+1是为了防止可能出现的最高进位
{
if(res[i]!=0) break;
}
ci = i;//去掉结果前面的零
endi=0;
for(i=0;i<=ci;i++)//i=ci+1是为了防止可能出现的最高进位
{//去掉结果小数点后面的零
if(i == dot) {endi = i; break;}
if(res[i]!=0 ) //注意可以包含到小数点(不输出小数点的情况i==dot,dot为小数点位置)!!!
{endi = i; break;}
}
for(i=ci;i>=endi;i--)
{
if(i == dot-1) printf(".");
printf("%d",res[i]);
}
printf("\n");
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(res,0,sizeof(res));
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
}
}