#include<stdio.h>
#include<string.h>
typedef struct {
char S1[60];//存储整数部分
char S2[60];//存储小数部分
} dnum;
char* min(char* S1, char* S2) {
if (strlen(S1) > strlen(S2))return S2;
return S1;
}
char* max(char* S1, char* S2) {
if (strlen(S1) > strlen(S2))return S1;
return S2;
}
void add1(char* str1, char* str2) {//计算小数部分
int i;
for (i = 0; i < strlen(str2); i++) {
str1[strlen(str2) - 1 - i] += str2[strlen(str2) - 1 - i] - '0';
}
for (i = strlen(str1) - 1; i > 0; i--) {
if (str1[i] >= '0' + 10) {
str1[i - 1] += (str1[i] - '0') / 10;
str1[i] = '0' + (str1[i] - '0') % 10;
}
}
}
void add2(char* str1, char* str2) {//计算整数部分
int i;
for (i = 0; i < strlen(str2); i++) {
str1[strlen(str1) - 1 - i] += str2[strlen(str2) - 1 - i] - '0';
}
for (i = strlen(str1) - 1; i > 0; i--) {
if (str1[i] >= '0' + 10) {
str1[i - 1] += (str1[i] - '0') / 10;
str1[i] = '0' + (str1[i] - '0') % 10;
}
}
}
int main() {
dnum A[2];
int i, j, n = 2;
for (i = 0; i < 2; i++) {
for (j = 0; j < 40; j++)A[i].S1[j] = A[i].S2[j] = '\0';
}
for (i = 0; i < 2; i++)gets(A[i].S1);
for (i = 0; i < 2; i++) {
for (j = 0; A[i].S1[j] != '.'; j++);
j++;
strcat(A[i].S2, &A[i].S1[j]);
j--;
for (; j < strlen(A[i].S1); j++)A[i].S1[j] = '\0';
}
char* str1 = max(A[0].S2, A[1].S2);
char* str2 = min(A[0].S2, A[1].S2);
add1(str1, str2);//小数部分相加
int flag = 0;
if (str1[0] >= '0' + 10) {
flag += (str1[0] - '0') / 10;//小数部分进位
str1[0] = (str1[0] - '0') % 10 + '0';
}
char* a = str1;
str1 = max(A[0].S1, A[1].S1);
str2 = min(A[0].S1, A[1].S1);
str1[strlen(str1) - 1] += flag;
flag = 0;
add2(str1, str2);//整数部分相加
if (str1[0] >= '0' + 10) {
flag += (str1[0] - '0') / 10;//整数部分进位
str1[0] = (str1[0] - '0') % 10 + '0';
}
if (flag != 0)printf("%d", flag);//若整数部分有进位,输出
printf("%s.%s\n", str1, a);
return 0;
}