#include<iostream>
#include<string>
using namespace std;
bool compare(string a, string b) {
//用在大数减法里面,判断两个数谁更大,保证大数减小数
int length_a = a.size() - 1;
int length_b = b.size() - 1;
bool flag;
if (length_a < length_b) {
//位数多的更大
return false;
}
else if (length_a > length_b) {
return true;
}
else {
for (int i = 0; i <= length_a; i++) {
if (a[i] < b[i]) {
return false;//从大到小任一位比出大小即返回结果
}
else if(a[i]>b[i]) {
return true;
}
}
return true;
}
}
string newplus(string a, string b) {
//大数加法
int length_a = a.size() - 1;
int length_b = b.size() - 1;
int length = min(length_a, length_b);
string result = "",temp;
int in = 0,length_temp;
if (length_a<length_b) {
//让位数更多的在前,后面处理尾串可以少写
temp = a;
a = b;
b = temp;
length_temp = length_a;
length_a = length_b;
length_b = length_temp;
}
for (int i = 0; i <= length; i++) {
//处理共同的位数
if (a[length_a - i] + b[length_b - i] + in - '0' > '9') {
char curnum = a[length_a - i] + b[length_b - i] + in - 10 - '0';
//两个字符相加需减掉一个‘0’字符
in = 1;
result = curnum + result;
}
else {
char curnum = a[length_a - i] + b[length_b - i] + in - '0';
in = 0;
result = curnum + result;
}
}
for (int i = 1; i <= length_a - length; i++) {
//处理尾串
if (a[length_a - length - i] + in > '9') {
char curnum = a[length_a - length - i] + in - 10;
in = 1;
result = curnum + result;
}
else {
char curnum = a[length_a - length - i] + in;
in = 0;
result = curnum + result;
}
}
if (in > 0) {
//边界条件容易遗漏:当最后两位相加结果有进位要在最前面补1
result = '1' + result;
}
return result;
}
string newminus(string a, string b) {
//大数减法
int length_a = a.size() - 1;
int length_b = b.size() - 1;
int length = min(length_a, length_b);
string result = "";
string temp;
int length_temp;
bool flag=compare(a,b);//判断大小关系
if (flag==false) {
//让大数减小数
temp = a;
a = b;
b = temp;
length_temp = length_a;
length_a = length_b;
length_b = length_temp;
}
int in = 0;
for (int i = 0; i <= length; i++) {
if (a[length_a - i] - b[length_b - i] + in < 0) {
char curnum = a[length_a - i] - b[length_b - i] + in + 10 + '0';//两字符相减需补上一个字符0
in = -1;
result = curnum + result;
}
else {
char curnum = a[length_a - i] - b[length_b - i] + in + '0';
in = 0;
result = curnum + result;
}
}
for (int i = 1; i <= length_a - length; i++) {
//处理尾串
if (a[length_a - length - i] + in < 0) {
char curnum = a[length_a - length - i] + in + 10;
in = -1;
result = curnum + result;
}
else {
char curnum = a[length_a - length - i] + in;
in = 0;
result = curnum + result;
}
}
if (result[0] == '0') {
//边界条件容易遗漏:减完首位可能为零,需去掉
result.erase(0, 1);//str.erase(pos,n)从pos位置开始删去n位字符
}
if (flag == false) {
result = '-' + result;//如果交换过位置,结果为负
}
return result;
}
string newmulti_1(string a, int b) {
//计算大数乘一位整数的结果
string result = "";
for (int i = 0; i < b; i++) {
result = newplus(result, a);//乘法转换为调用多次加法
}
return result;
}
string newmulti(string a, string b) {
//大数乘法
int length_a = a.size() - 1;
int length_b = b.size() - 1;
string result = "";
for (int i = 0; i <= length_b; i++) {
int num_b = b[length_b - i] - '0';
//每次取右乘数的一位去乘左乘数,然后补若干位零与上次结果相加
string a1 = newmulti_1(a, num_b);
for (int j = 0; j < i; j++) {
a1 += '0';
}
result = newplus(result, a1);
}
return result;
}
int main() {
string a = "", b = "";
cin >> a;
cin >> b;
cout << newplus(a, b) << endl;
cout << newminus(a, b) << endl;
cout << newmulti(a, b) << endl;
return 0;
}