首先,我们可以写一个结构体,来定义高精度。
其次,我们可以回忆小学时的竖式加减乘除
然后就没有然后了
#include<cstdio>
#include<cstring>
using namespace std;
char s1[10005] , s2[10005];
struct big_number{int len , data[10005];bool opt;}a , b;//1正0负
inline int max(int x , int y){return x > y ? x : y;}
void write(big_number x)
{
if(!x.opt) putchar('-');
for(int i = x.len;i >= 1;i--) putchar(x.data[i] + 48);
puts("");
}
big_number change(char s[])
{
big_number res;
memset(res.data , 0 , sizeof res.data);
if(s[0] != '-')
{
for(int i = strlen(s);i >= 1;i--) s[i] = s[i - 1];
s[0] = '+';
res.opt = 1;
}
else res.opt = 0;
memset(res.data , 0 , sizeof res.data);
res.len = strlen(s) - 1;
for(int i = 1;i <= res.len;i++) res.data[i] = s[res.len - i + 1] - 48;
return res;
}
big_number abs(big_number x){x.opt |= 1;return x;}
void swap(big_number &a , big_number &b){big_number tmp = a;a = b;b = tmp;}
bool operator == (big_number a , big_number b)
{
if(a.opt != b.opt) return 0;
if(a.len != b.len) return 0;
for(int i = 1;i <= a.len;i++)
if(a.data[i] != b.data[i]) return 0;
return 1;
}
bool operator > (big_number a , big_number b)
{
if(a.opt > b.opt) return 1;
if(a.opt < b.opt) return 0;
if(a.len != b.len)
{
if(a.opt) return a.len > b.len;
if(!a.opt) return a.len < b.len;
}
if(a.opt)
for(int i = 1;i <= a.len;i++)
{
if(a.data[i] > b.data[i]) return 1;
if(a.data[i] < b.data[i]) return 0;
}
}
bool operator != (big_number a , big_number b){return !(a == b);}
bool operator < (big_number a , big_number b){return a != b && !(a > b);}
bool operator >= (big_number a , big_number b){return a > b || a == b;}
bool operator <= (big_number a , big_number b){return a < b || a == b;}
big_number plus(big_number a , big_number b)
{
big_number res;
memset(res.data , 0 , sizeof res.data);
res.len = max(a.len , b.len);
for(int i = 1;i <= res.len;i++)
{
res.data[i] += a.data[i] + b.data[i];
res.data[i + 1] += res.data[i] / 10;
res.data[i] %= 10;
}
if(res.data[res.len + 1] > 0) res.len++;
return res;
}
big_number minus(big_number a , big_number b)
{
bool flag = 1;
if(a < b) swap(a , b);
big_number res;
memset(res.data , 0 , sizeof res.data);
res.len = max(a.len , b.len);
for(int i = 1;i <= res.len;i++)
{
res.data[i] += a.data[i] - b.data[i];
if(res.data[i] < 0) res.data[i] += 10 , res.data[i + 1]--;
}
while(!res.data[res.len] && res.len > 1) res.len--;
return res;
}
big_number operator * (big_number a , big_number b)
{
big_number res;
res.opt = !(a.opt ^ b.opt);
memset(res.data , 0 , sizeof res.data);
for(int i = 1;i <= a.len;i++)
for(int j = 1;j <= b.len;j++)
res.data[i + j - 1] += a.data[i] * b.data[j];
for(int i = 1;i <= a.len + b.len;i++)
{
res.data[i + 1] += res.data[i] / 10;
res.data[i] %= 10;
}
if(res.data[a.len + b.len] > 0) res.len = a.len + b.len;
else res.len = a.len + b.len - 1;
return res;
}
big_number operator + (big_number a , big_number b)
{
big_number res;
memset(res.data , 0 , sizeof res.data);
if(a.opt && b.opt) res = plus(a , b) , res.opt = 1;
if(!a.opt && !b.opt) res = plus(a , b) , res.opt = 0;
if(!a.opt && b.opt)
{
if(abs(a) > abs(b)) res = minus(a , b) , res.opt = 0;
if(abs(a) <= abs(b)) res = minus(b , a) , res.opt = 1;
}
if(a.opt && !b.opt)
{
if(abs(a) >= abs(b)) res = minus(a , b) , res.opt = 1;
if(abs(a) < abs(b)) res = minus(b , a) , res.opt = 0;
}
return res;
}
big_number operator - (big_number a , big_number b)
{
big_number res;
memset(res.data , 0 , sizeof res.data);
if(a.opt && b.opt)
{
if(a >= b) res = minus(a , b) , res.opt = 1;
if(a < b) swap(a , b) , res = minus(a , b) , res.opt = 0;
}
if(a.opt && !b.opt) res = plus(a , b) , res.opt = 1;
if(!a.opt && b.opt) res = plus(a , b) , res.opt = 0;
if(!a.opt && !b.opt)
{
if(a >= b) res = minus(a , b) , res.opt = 1;
if(a < b) swap(a , b) , res = minus(a , b) , res.opt = 0;
}
return res;
}
big_number operator / (big_number a , int b)
{
char res[1005] = "";
int len = 0;
int tmp = 0;
int i;
for(i = a.len;tmp < b && i >= 1;i--) tmp = (tmp << 3) + (tmp << 1) + a.data[i] - 48;
res[len++] = (char)(tmp / b - 48);
i--;
for(;i >= 1;i--)
{
tmp = tmp % b * 10 + a.data[i];
res[len++] = (char)(tmp / b - 48);
}
return change(res);
}
int operator % (big_number a , int b)
{
int res = 0;
int i;
for(i = a.len;res < b && i >= 1;i--) res = (res << 3) + (res << 1) + a.data[i] - 48;
i--;
for(;i >= 1;i--) res = res % b * 10 + a.data[i];
return res % b;
}
int main()
{
scanf("%s%s",s1,s2);
write(change(s1) - change(s2));
return 0;
}