#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
#define M 1000000000000000
//大数加法
//将数字以字符串的形式传入add加法函数,在函数内部完成字符串->数组的转换,
//然后在数组中逐位进行相加,再判断该位相加后是否需要进位,为了方便计算,我们将数字的低位放在数组的 //前面,高位放在后面。
void add(char stra[],char strb[])
{
int a[M],b[M];
int i,maxlen,alen,blen;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
alen=strlen(stra);
blen=strlen(strb);
maxlen=alen>blen?alen:blen;
for(i=alen-1;i>=0;i--)//从地址为1开始到存放数据
a[alen-i]=stra[i]-'0';
for(i=blen-1;i>=0;i--)
b[blen-i]=strb[i];
for(i=1;i<maxlen;i++)
{
a[i]+=b[i];
if(a[i]>9)
{
if(i==maxlen)
maxlen++;
a[i+1]++;
a[i]%=10;
}
}
for(i=maxlen;i>0;i--)
printf("%d",a[i]);
}
//大数减法
//相减算法也是从低位开始减的。
//先要判断被减数和减数哪一个位数长,若被减数位数长是正常的减法;若减数位数长,则用被减数减去减数,
//最后还要加上负号;当两数位数长度相等时,需要比较哪一个数字大,否则负号处理会很繁琐;这里以
//a[0]==1为前一项大于后一项;处理每一项时要,如果前相减小于0需要向前一位借1,
void subtract(char stra[],char strb[])
{
int a[M],b[M];
int i,maxlen,alen,blen;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
alen=strlen(stra);
blen=strlen(strb);
if(alen>blen){
maxlen=alen;a[0]=1;
}
else if(alen==blen)
{
if(strcmp(stra,strb))
a[0]=1;
else
a[0]=0;
}
else
{
maxlen=blen;a[0]=0;
}
for(i=alen-1;i>=0;i--)//从地址为1开始到存放数据
a[alen-i]=stra[i]-'0';
for(i=blen-1;i>=0;i--)
b[blen-i]=strb[i];
for(i=1;i<maxlen;i++)
{
if(a[0]==1)
{
a[i]-=b[i];
if(a[i]<0)
{
a[i+1]--;
a[i]+=10;
}
}
if(a[0]==1)
{
b[i]-=a[i];
if(a[i]<0)
{
b[i+1]--;
b[i]+=10;
}
}
}
printf("-") ;
if(a[0]==1)
{
for(i=maxlen;a[i]!=0;i--);i++;
for(i;i>0;i--)
printf("%d",a[i]);
}
if(a[0]==0)
{
for(i=maxlen;b[i]!=0;i--);i++;
for(i;i>0;i--)
printf("%d",b[i]);
}
}
//计算的过程基本上和小学生列竖式做乘法相同。为了编程方便,并不急于处理进位,而是将进位问题留待最后
//统 一处理。
void cheng (char stra[],char strb[])
{
int a[M],b[M],x=0,c[M];
int j,i,maxlen,alen,blen;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
alen=strlen(stra);
blen=strlen(strb);
maxlen=alen>blen?alen:blen;
for(i=alen-1;i>=0;i--)//从地址为1开始到存放数据
a[alen-i]=stra[i]-'0';
for(i=blen-1;i>=0;i--)
b[blen-i]=strb[i];
for(i=1;i<maxlen;i++)
{
for(j=i;j<maxlen;j++)
{
c[j]+=a[j]*b[i];
}
}
for(i=1;i<maxlen;i++)
{
a[i]+=x;
if(a[i]>9)
{
if(i==maxlen)
maxlen++;
x=a[i]/10;
a[i]%=10;
}
}
for(i=maxlen;i>0;i--)
printf("%d",a[i]);
}
//大数除法
//看了网上大多数的大数除法都是以递减的形式进行运算,我不喜欢这种方法,所以找了一种不能完全属于大
//数的除法,具体方法以123/12位例,1/12=0~1,b[1]=0; 12/12=1~0 ,b[2]=1; 3/12=0~3,
//b[3]=0;
//所以123/12=10~3;
void divide(char stra[],char strb[])
{
int x=0,i,alen;
long c;
c=atol(strb);
int a[M],b[M];
memset(a,0,sizeof(a));
alen=strlen(strb);
for(i=alen-1;i>=0;i--)//从地址为1开始到存放数据
a[alen-i]=stra[i]-'0';
for(i=1;i<=alen;i++)
{
x=x*10+a[i];
b[i]=x/c;
x=x%c;
}
while(b[i]==0)
i++;
for(i;i<=alen;i++)
printf("%d",b[i]);
printf("模为%d",x);
}