摘自大佬博客
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int power=1;//每次运算的位数为10的power次方
const int base=10;//10的power次方
const int N=1001;
char a[N],b[N];
struct Bignum{
int a[N];
Bignum(){memset(a,0,sizeof(a));}
Bignum(char *s)//初始化数组,转化为高精度数
{
memset(a,0,sizeof(a));
int len=strlen(s);
a[0]=(len+power-1)/power;
for(int i=0,t=0,w;i<len;w*=10,++i)
{
if(i%power==0){w=1;++t;}
a[t]+=w*(s[i]-'0');
}
}
void add(int k){if(k||a[0])a[++a[0]]=k;}//在数的末尾添加一个数
void re(){reverse(a+1,a+a[0]+1);}//把数反过来
void print()
{
printf("%d",a[a[0]]);//先打印最高位
for(int i=a[0]-1;i;i--)
printf("%0*d",power,a[i]);//输出power位
printf("\n");
}
}p,q,ans;
bool operator<(const Bignum&p,const Bignum&q)//判断小于关系
{
if(p.a[0]<q.a[0])return true;
if(p.a[0]>q.a[0])return false;
for(int i=p.a[0];i;i--)
if(p.a[i]!=q.a[i])return p.a[i]<q.a[i];
return false;
}
Bignum operator +(const Bignum&p,const Bignum&q)
{
Bignum c;
c.a[0]=max(p.a[0],q.a[0]);
for(int i=1;i<=c.a[0];i++)
{
c.a[i]+=p.a[i]+q.a[i];
c.a[i+1]+=c.a[i]/base;
c.a[i]%=base;
}
if(c.a[c.a[0]+1])++c.a[0];
return c;
}
Bignum operator -(const Bignum&p,const Bignum&q)
{
Bignum c=p;
for(int i=1;i<=c.a[0];i++)
{
c.a[i]-=q.a[i];
if(c.a[i]<0){c.a[i]+=base;--c.a[i+1];}
}
while(c.a[0]>0&&!c.a[c.a[0]])--c.a[0];
return c;
}
Bignum operator *(const Bignum&p,const Bignum&q)
{
Bignum c;
c.a[0]=p.a[0]+q.a[0]-1;
for(int i=1;i<=p.a[0];i++)
for(int j=1;j<=q.a[0];j++)
{
c.a[i+j-1]+=p.a[i]*q.a[j];
c.a[i+j]+=c.a[i+j-1]/base;
c.a[i+j-1]%=base;
}
if(c.a[c.a[0]+1])++c.a[0];
return c;
}
Bignum operator /(const Bignum&p,const Bignum&q)
{
Bignum x,y;
for(int i=p.a[0];i>=1;i--)//从最高位开始取数
{
y.add(p.a[i]);//把数添加到最低位,高位在前,低位在后
y.re();//变成低位在前高位在后
while(!(y<q))//大于等于除数
y=y-q,++x.a[i];//看能减去几个除数
y.re();
}
x.a[0]=p.a[0];
while(x.a[0]>0&&!x.a[x.a[0]])--x.a[0];
return x;
}
int main()
{
scanf("%s",a);
scanf("%s",b);
reverse(a,a+strlen(a));
reverse(b,b+strlen(b));
p=Bignum(a);q=Bignum(b);
ans=p+q;
ans.print();
ans=p-q;
ans.print();
ans=p*q;
ans.print();
ans=p/q;
ans.print();
return 0;
}