大整数乘法(分治法)
c[i+1]=t%10;
carry=t/10;
}
c[0]=carry;
return length+1;
}
//两个长度为length的大整数做减法,得到的结果放到数组C中,长度为lengthint Sub(int a[],int b[],int c[],int length)
{
int borrow=0;
int i=0;
while(c[i]==0) i++;
for(;i<l;i++)
printf("%d",c[i]);
printf("\n");
{
}printf("内存分配失败,递归失败,程序退出!\n");
exit(0);
//将原来的两个大整数,分治为一半,分别放入到a1,a0和b1,b0四个数组当中去for(int i=0;i<l;i++)
{a1[i]=a[i];b1[i]=b[i];}
for(int i=l;i<len;i++)
{a0[i-l]=a[i];b0[i-l]=b[i];}
//打印输出c2,c1和c0
int i=0;printf( Nhomakorabeac2=");
while(c2[i]==0) i++;
for(;i<2*l;i++)
printf("%d",c2[i]);
printf("\n");
int j=0;
printf("c0=");
while(c0[j]==0) j++;
for(;j<2*l;j++)
b[i]=0;
len_align=len_a;
}
else if(len_a<len_b)
{
for(int i=len_a-1;i>=0;i--)
a[i+(len_b-len_a)]=a[i];
for(int i=0;i<len_b-len_a;i++)
}}a[i]=0;
len_align=len_b;
int AlignArray(int *a,int len_a,int *b,int len_b)
{
int len_align=len_a;
if(len_a>len_b)
{
for(int i=len_b-1;i>=0;i--)
b[i+(len_a-len_b)]=b[i];
for(int i=0;i<len_a-len_b;i++)
//再来求得c1,这里有乘法也有加法,还有减法
//c1=(a1+a0)*(b1+b0)-(c2+c0)
int *t1,*t2,*t3,*t4,*c1;
t1=(int *)malloc((1+l)*sizeof(int)); //t1=a1+a0
t2=(int *)malloc((1+l)*sizeof(int)); //t2=b1+b0
{
printf("内存分配失败,递归失败,程序退出!\n");
exit(0);
}
int len1=Add(a1,a0,t1,l); //t1=a1+a0,长度为l+1
int len2=Add(b1,b0,t2,l);//t2=b1+b0,长度为l+1
int len4=Add(c2,c0,t4,2*l);//t4=c2+c0,长度为2*l+1
printf("%d",c0[j]);
printf("\n");
int n=0;
printf("c1=");
while(c1[n]==0) n++;
for(;n<len5;n++)
printf("%d",c1[n]);
printf("\n");
}
return 2*len;
}
void main()
{
}int a[DATASIZE],b[DATASIZE],c[2*DATASIZE];
int i=0;
printf("Input a Big Interger:");
while(1)
{
scanf("%c",&ch);
if(ch=='\n')break;
elsearr[i++]=ch-'0';
}
return i;
}
//该函数通过在较短的大整数之前填充0的方式,将两个大整数的位数对齐,返回值为较长的那个大整数的位置
t3=(int *)malloc((1+2*l)*sizeof(int));//t3=t1*t2
t4=(int *)malloc(2*(l+1)*sizeof(int));//t4=c2+c0
c1=(int *)malloc(2*(l+1)*sizeof(int));//c1=t3-t4
if(t1==NULL || t2==NULL || t3==NULL)
int DividBigIntMultiply(int a[],int b[],int c[],int len)
{
int l=len/2;
if(len==1)
{
int t=a[0]*b[0];
c[0]=t/10;
c[1]=t%10;
return 2;
}
elseif(len==2)
{
int t1=a[1]*b[1];
int len_a,len_b,len_align;
len_a=InputBigInt(a);
len_b=InputBigInt(b);//输入大整数a
//输入大整数b
len_align=AlignArray(a,len_a,b,len_b);//针对两个大整数做对齐
int l=DividBigIntMultiply(a,b,c,len_align);
//两个长度为length的大整数做加法,得到的结果放到数组C中,长度为length+1int Add(int a[],int b[],int c[],int length)
{
int carry=0;
for(int i=length-1;i>=0;i--)
{
int t=a[i]+b[i]+carry;
int l1=AlignArray(a1,l,a0,len-l);
int l2=AlignArray(b1,l,b0,len-l);
l=l1;
//先求得c2和c0,直接做乘法就可以了
int *c2,*c0;
c2=(int *)malloc(2*l*sizeof(int));
c0=(int *)malloc(2*l*sizeof(int));
if(c2==NULL || c0==NULL)
{
printf("内存分配失败,递归失败,程序退出!\n");
exit(0);
}
DividBigIntMultiply(a1,b1,c2,l);//c2=a1*b1,长度为2*l
DividBigIntMultiply(a0,b0,c0,l);//c0=a0*b0,长度为2*l
c[3]=t1%10;
int t2=a[0]*b[1]+a[1]*b[0]+t1/10;
c[2]=t2%10;
int t3=a[0]*b[0]+t2/10;
c[1]=t3%10;
c[0]=t3/10;
return 4;
}
else
{
int *a1,*a0,*b1,*b0;
a1=(int *)malloc(l*sizeof(int));
int len3=AlignArray(t1,len1,t2,len2);
DividBigIntMultiply(t1,t2,t3,len3);//t3=t1*t2,长度为2*(l+1)
int k=AlignArray(t4,len4,t3,len3);//将c1与t3对齐,长度为2*(l+1)
int len5=Sub(t4,t3,c1,k); //c1=t4-t3,长度为2*(l+1)
for(int i=length-1;i>=0;i--)
{
}a[i]=a[i]-borrow;
if(a[i]>=b[i])
{
c[i]=a[i]-b[i];
borrow=0;
}
else
{
int t=a[i]+10-b[i];
borrow=1;
}
}
return length;
//分治法求两个大整数的乘积,它只需要更少次数的乘法,但是它必须递归
return len_align;
//该函数通过删去大整数前面无意义的0来得到其真实的数字位数
int Adjust(int a[],int len)
{
while(a[0]==0)
{
int j=1;
do{
a[j-1]=a[j];
j++;
}while(j<len);
len--;
}