#include <iostream>
#include <string>
#include <cstring>
using namespace std;
/*
按顺序打印数组元素
flag为true时正序打印
flag为false时倒序打印
*/
template <typename T>
void show(T arr[], int len, bool flag=true){
if(flag) // 正序打印
for(int i=0;i<len;i++)
cout << arr[i];
else // 逆序打印
for(int i=len-1;i>=0;i--)
cout << arr[i];
cout << endl;
}
int main()
{
string str1, str2;
// 字符串方式获取数字
cin >> str1 >> str2;
// 确定字符串的长度
int len1 = str1.length();
int len2 = str2.length();
// 取最长的字符长度作为转换后的数字数组长度,确保长度不一的加数遍历不会越界
// 如1248+384466转为842100 和 664483
int len = len1 > len2 ? len1 : len2;
// 根据确定的长度创建用于存储数字的数组,
int num1[len],num2[len];
// 使用memset函数将内存数据置为0
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));
// 倒序的方式填充数字数组
// str1和str2中存储的是数字字符,每个数字字符有其对应的ASCII码值,'0'字符ASCII码值为48
// 因此要将字符转为int值,可以用str[i]-'0'或str[i]-48求字符差值的方式计算
for(int i=0;i<len1;i++) num1[i] = str1[len1-i-1]-'0';
for(int i=0;i<len2;i++) num2[i] = str2[len2-i-1]-48;
// show(num1, len);
// show(num2, len);
// 加法的极限就是最大加数的长度+1,因此可以初步判断和的最大长度
int num3[len+1];
// 进行加运算
// index为和数组的当前下标,最终也为和数组的实际长度-1
// x为每位相加后的进位值
int index = 0, x = 0;
while(index < len)
{
// 对应的位求和并加上已存在的进位值
num3[index] = num1[index] + num2[index] + x;
// 两位相加大于10,需要进位
if(num3[index] > 10)
{
// 求进位部分
x = num3[index] / 10;
// 取余
num3[index] %= 10;
}else x = 0; // 没超过10,x为0
index++;
}
// while循环完成,如果x不为0,说明最高位应赋值
// x为0则说明和未突破加数的位数,index--以作为num3的实际长度
if(x != 0)
{
num3[index] = x;
}
else index--;
show(num3, index+1, false);
return 0;
}