#include<bits/stdc++.h>
using namespace std;
struct BigInteger {
int len,num[100001];
char sign;
BigInteger() {
len = 0;
sign = '+';
memset(num,0,sizeof(num));
}
void input() {
char c[100001];
cin >> c;
len = strlen(c);
if(c[0] == '-') {
for(int i = 1; i < len; i++)
num[len - i - 1] = c[i] - '0';
sign = '-';
len--;
} else
for(int i = 0; i < len; i++)
num[len - i - 1] = c[i] - '0';
for(int i = len - 1; i > 0 && num[i] == 0; len--,i--);
}
void output() {
if (sign == '-')
cout << sign;
for(int i = len - 1; i >= 0; i--)
cout << num[i];
cout << '\n';
}
BigInteger calculator(BigInteger a,char op,BigInteger b) {
switch(op) {
case '+':
if(a.sign == '+' && b.sign == '+')
add(a,b);
else if(a.sign == '+' && b.sign == '-')
sub1(a,b);
else if(a.sign == '-' && b.sign == '+')
sub1(b,a);
else {
sign = '-';
a.sign = b.sign = '+';
add(a,b);
}
break;
case '-':
if(a.sign == '+' && b.sign == '+')
sub1(a,b);
else if(a.sign == '+' && b.sign == '-') {
b.sign = '+';
add(a,b);
} else if(a.sign == '-' && b.sign == '+') {
sign = '-';
a.sign = '+';
add(a,b);
} else {
b.sign = '+';
sub1(b,a);
}
break;
case '*':
if((a.len == 1 && a.num[0] == 0) || (b.len == 1 && b.num[0] == 0)) {
len = 1;
num[0] = 0;
break;
}
if((a.sign == '+' && b.sign == '+') || (a.sign == '-' && b.sign == '-'))
sign = '+';
else
sign = '-';
mul(a,b);
break;
case '/':
if(b.len == 1 && b.num[0] == 0) {
cout << "DIVISION ZERO ERROR\n";
exit(0);
}
if((a.len == 1 && a.num[0] == 0) || (b.len == 1 && b.num[0] == 0)) {
len=1;
num[0]=0;
break;
}
if((a.sign == '+' && b.sign == '+') || (a.sign == '-' && b.sign == '-'))
sign = '+';
else
sign = '-';
return div1(a,b);
}
return a;
}
bool less_than(BigInteger a) {
if(len != a.len)
return len < a.len;
for(int i = len; i >= 1; i--)
if(num[i] != a.num[i])
return num[i] < a.num[i];
return false;
}
void add(BigInteger a,BigInteger b) {
len = a.len > b.len ? a.len : b.len;
for(int i = 0; i < len; i++) {
num[i] += a.num[i] + b.num[i];
if(num[i] >= 10) {
num[i + 1] = num[i + 1] + 1;
num[i] = num[i] - 10;
}
}
if(num[len]!=0)
len++;
}
void sub1(BigInteger a, BigInteger b) {
len = a.len > b.len ? a.len : b.len;
bool LE = a.less_than(b);
if( !LE )
for(int i = 0; i < len; i++) {
if(a.num[i] < b.num[i]) {
a.num[i + 1]--;
a.num[i] += 10;
}
num[i] = a.num[i] - b.num[i];
}
else {
sign = '-';
for(int i = 0; i < len; i++) {
if(b.num[i] < a.num[i]) {
b.num[i + 1]--;
b.num[i] += 10;
}
num[i] = b.num[i] - a.num[i];
}
}
for(int i = len - 1; i > 0 && num[i] == 0; len--, i--);
}
void sub2(BigInteger a, BigInteger b) {
len = a.len>b.len ? a.len : b.len;
for(int i = 0; i < len; i++)
num[i] = a.num[i] - b.num[i];
for(int i = len - 1; i > 0 && num[i] == 0; len--,i--);
if(num[len - 1] < 0) {
sign = '-';
for(int i = len - 1; i >= 0; i--)
num[i] *= -1;
}
for(int i = 0; i < len; i++)
if(num[i] < 0) {
num[i] += 10;
num[i + 1] -= 1;
}
for(int i = len - 1; i > 0 && num[i] == 0; len--, i--);
}
void mul(BigInteger a, BigInteger b) {
if((a.len == 1 && a.num[0] == 0) || (b.len == 1 && b.num[0] == 0)) {
len = 0;
num[0] = 0;
return ;
}
for(int i = 0; i < a.len; i++)
for(int j = 0; j < b.len; j++) {
num[i + j] += a.num[i] * b.num[j];
num[i + j + 1] += num[i + j] / 10;
num[i + j] = num[i + j] % 10;
}
len = a.len + b.len;
if(num[len - 1] == 0)
len--;
}
void plusplus() {
int i;
num[0]++;
for(i = 0; num[i] >= 10; i++) {
num[i + 1] = num[i + 1] + 1;
num[i] = num[i] - 10;
}
if(i == len)
len++;
}
BigInteger div1(BigInteger a, BigInteger b) {
len = 1;
memset(num,0,sizeof(num));
if(a.less_than(b))
return a;
while( !a.less_than(b) ) {
a.sub2(a,b);
plusplus();
}
return a;
}
void leftshift(int count) {
if(count == 0)
return;
for(int i = len - 1; i >= 0; i--)
num[i + count] = num[i];
for(int i = count - 1; i >= 0; i--)
num[i] = 0;
len += count;
return ;
}
BigInteger div2(BigInteger a, BigInteger b) {
len = 1;
memset(num, 0, sizeof(num));
if(a.less_than(b))
return a;
len = a.len - b.len + 1;
BigInteger t = b;
for(int i = len - 1; i >= 0; i--) {
t.leftshift(i);
while( !a.less_than(t) ) {
a.sub1(a, t);
num[i]++;
}
t=b;
}
while( num[len-1] == 0 )
len--;
return a;
}
} x, y, a, s, m, d, rem;
int main() {
x.input();
y.input();
a.calculator(x, '+', y);
s.calculator(x, '-', y);
m.calculator(x, '*', y);
d.calculator(x, '/', y);
rem = d.calculator(x, '/', y);
a.output();
s.output();
m.output();
d.output();
rem.output();
return 0;
}
测评记录