大整数乘法(分治法)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
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)
//再来求得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
int i=0;
printf("Input a Big Interger:");
while(1)
{
scanf("%c",&ch);
if(ch=='\n')break;
elsearr[i++]=ch-'0';
}
return i;
}Baidu Nhomakorabea
//该函数通过在较短的大整数之前填充0的方式,将两个大整数的位数对齐,返回值为较长的那个大整数的位置
//打印输出c2,c1和c0
int i=0;
printf("c2=");
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++)
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];
{
}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];}
a0=(int *)malloc((len-l)*sizeof(int));
b1=(int *)malloc(l*sizeof(int));
b0=(int *)malloc((len-l)*sizeof(int));
if(a1==NULL || a0==NULL || b1==NULL || b0==NULL)
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--;
}
return len;
}
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 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++)
//两个长度为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;
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;
//分治法求两个大整数的乘积,它只需要更少次数的乘法,但是它必须递归
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 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));
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);
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)
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));
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>
#define DATASIZE 1000
//该函数用以接收用户输入的大整数,返回值为该大整数的数字位数
int InputBigInt(int arr[])
{
char ch;
int i=0;
while(c[i]==0) i++;
for(;i<l;i++)
printf("%d",c[i]);
printf("\n");
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;
相关文档
最新文档