#include <iostream>
#include <cstring>
using namespace std;
class CArray {
public:
int *p = NULL;
int * init(int s) {
if (p)
delete[]p;
p = new int[s];
return p;
}
~CArray() {
if (p) delete[]p;
}
};
class Add {
int *a;//整数a
int *b;//整数b
int la, lb;//两个整数的长度
int end;//结果的结尾
int *result;
public:
Add(int *a_,int *b_, int la_, int lb_) :a(a_), b(b_), la(la_), lb(lb_){}
int * calculate() {
int front = 0;
int maxlen = la > lb ? la : lb;
result = new int[maxlen + 1];
end = maxlen;
int r, i, j;
for (i = la - 1, j = lb - 1; i >= 0 && j >= 0; i--, j--) {
if ((r = a[i] + b[j] + front) >= 10) { result[maxlen--] = r - 10; front = 1; }//向前进1
else {
result[maxlen--] = r;
front = 0;
}
}
while (i >= 0) {//a剩余位处理
if ((r = front + a[i]) >= 10) { result[maxlen--] = r - 10; front = 1; }
else {
result[maxlen--] = r; front = 0;
}
i--;
}
while (j >= 0) {//b剩余位处理
if ((r = front + b[j]) >= 10) { result[maxlen--] = r - 10; front = 1; }
else{
result[maxlen--] = r; front = 0;
}
j--;
}
result[maxlen] = front;
return result;
}
void print() {
int k = 1;
if (result[0] == 1) k = 0;
while (k <= end) { cout<<result[k]; k++; }
}
~Add() {
if(result) delete result;
}
};
class Sub {
int *a;
int *b;
int la, lb;
int end;
int *result;
public:
Sub(int *a_, int *b_, int la_, int lb_) :a(a_), b(b_), la(la_), lb(lb_) {}
int * calculate() {
int front = 0;
int maxlen = la > lb ? la : lb;//la与lb的中的较大长度
result = new int[maxlen + 1];//开辟一个0位为冗余位的存储结果的空间
end = maxlen;//结果尾下标
int r, i, j;
if (la > lb || ((la == lb) && a[0] >= b[0])) {//大数减小数
for (i = la - 1, j = lb - 1; i >= 0 && j >= 0; i--, j--) {
if ((r = a[i] - b[j] - front) < 0) { result[maxlen--] = r + 10; front = 1; }
else {
result[maxlen--] = r;
front = 0;
}
}
while (i >= 0) {//a剩余
if ((r = a[i] - front) < 0) { result[maxlen--] = r + 10; front = 1; }
else {
result[maxlen--] = r; front = 0;
}
i--;
}
}
else {//小数减大数转换成大数减小数,置负数标志front = 1
for (i = la - 1, j = lb - 1; i >= 0 && j >= 0; i--, j--) {
if ((r = b[j] - a[i] - front) < 0) { result[maxlen--] = r + 10; front = 1; }//不够减,向前借一位
else {
result[maxlen--] = r;
front = 0;
}
}
while (j >= 0) {//b剩余
if ((r = b[j] - front) < 0) { result[maxlen--] = r + 10; front = 1; }
else {
result[maxlen--] = r; front = 0;
}
j--;
}
front = 1;//负数标志
}
result[0] = front;//置标志位
return result;
}
void print() {
int i = 1;
if (result[0] == 1) cout << '-';//打印负数
while (i < end && result[i] == 0)i++;//跳过前面的0
while (i <=end) { cout << result[i]; i++; }
}
~Sub() {
if (result) delete[]result;
}
};
class Multiply {
int *a;
int *b;
int la;
int lb;
int end;
int *result;
CArray re;
public:
Multiply(int *a_, int *b_, int la_, int lb_) :a(a_), b(b_),la(la_),lb(lb_) {}
int * calculate() {
int i, *temp1, *temp2, in;//temp1为当前计算结果,temp2为向前进位的数
in = 0;
for (i = la - 1; i >= 0; i--) {
int k;
int lt = lb;
CArray tmp1;
temp1 = tmp1.init(lb);
for (k = 0; k < lb; k++)
temp1[k] = 0;
while (a[i] > 0) {//用加法实现一位乘法,为n就加n次
Add r(temp1, b, lt, lb);
int *temp3 = r.calculate();
if (temp3[0] >= 1) {//结果进1
lt++;
temp1 = tmp1.init(lt);
for (int k = 0; k < lt; k++)
temp1[k] = temp3[k];
}
else {//结果不进1
temp1 = tmp1.init(lt);
for (k = 0; k < lt; k++)
temp1[k] = temp3[k + 1];
}
a[i]--;
}
if (i == la - 1) {//第一位相乘
end = lt;
result = re.init(lt);
for (k = 0; k < lt; k++) {
result[k] = temp1[k];
}
}
if (i < la - 1) {//第二位相乘后左移
CArray tmp2;
temp2 = tmp2.init(in + lt);//in+lt为结果所需的位数
for (k = 0; k < lt; k++)
temp2[k] = temp1[k];
while (k < (in + lt)) { temp2[k] = 0; k++; }
Add r(result, temp2, end, in + lt);//与上一次的结果相加得到本位的最终结果
int *temp3 = r.calculate();
if (temp3[0] == 1) {//结果进1
result = re.init(in + lt + 1);
for (k = 0; k < in + lt + 1; k++)
result[k] = temp3[k];
end = in + lt + 1;
}
else {//结果不进1
result = re.init(in + lt);
for (k = 0; k < (in + lt); k++)
result[k] = temp3[k+1];
end = in + lt;
}
}
in++;//进位增量
}
return result;
}
void print() {//输出
int k = 0;
while (result[k] == 0 && k < end - 1) k++;//跳过前缀0
for (; k < end; k++)
cout << result[k];
}
};
class Divide {
int *a;
int *b;
int la;
int lb;
int end;
int *result;
CArray re;
public:
Divide(int *a_, int *b_, int la_, int lb_) :a(a_), b(b_), la(la_), lb(lb_) { end = 0; }
int * calculate() {
if (la < lb || (la == lb && a[0] < b[0])) {//小数除大数
result = re.init(1);
result[end++] = 0;
}
else {
int in, front = 0, *temp;//in为右移增量,front为开始计算位
result = re.init(la - lb + 1);
if (a[0] < b[0]) in = lb;
else in = lb - 1;
int i = 0, lt;
while (in < la) {
CArray tmp;
i = front;
lt = in - i + 1;
temp = tmp.init(lt);
for (int k = 0; i <= in;k++) {
temp[k] = a[i];
i++;
}
int tmp3 = 0;
while (1) {
Sub r(temp, b, lt, lb);
int *tmp2 = r.calculate();
if (tmp2[0] != 1) {
for (int k = 0; k < lt; k++) { temp[k] = tmp2[k + 1]; } ++tmp3;
}
else {
result[end++] = tmp3;
i = front;
for (int k = 0; k < lt; k++) {
a[i] = temp[k];
i++;
}
break;
}
}
if (a[front + 1] == 0) front++;
in++;
}
}
return result;
}
void print() {
int k = 0;
while (k < end) cout << result[k++];
}
};
int main() {
int a[101]{ 0 }, b[101] = { 0 };
char o, c1[101], c2[101];
int i, j;
cin.getline(c1, 102);
for (i = 0;c1[i] != '\0'; i++)
a[i] = c1[i] - 48;
cin >> o;
getchar();
cin.getline(c2, 101);
for (j = 0; c2[j] != '\0'; j++)
b[j] = c2[j] - 48;
if (o == '+') { Add r1(a, b, i, j); r1.calculate(); r1.print(); }
if (o == '-') { Sub r2(a, b, i, j); r2.calculate(); r2.print(); }
if (o == '*') { Multiply r3(a, b, i, j); r3.calculate(); r3.print(); }
if (o == '/') { Divide r4(a, b, i, j); r4.calculate(); r4.print(); }
cout << endl;
return 0;
}