#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<math.h>#define DATASIZE 1000//该函数用以接收用户输入的大整数,返回值为该大整数的数字位数int InputBigInt(int arr[]){char ch;int i=0;printf("Input a Big Interger:");while(1){scanf("%c",&ch);if(ch=='\n') break;else arr[i++]=ch-'0';}return i;}//该函数通过在较短的大整数之前填充0的方式,将两个大整数的位数对齐,返回值为较长的那个大整数的位置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++)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;}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;}//两个长度为length的大整数做加法,得到的结果放到数组C中,长度为length+1 int 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;c[i+1]=t%10;carry=t/10;}c[0]=carry;return length+1;}//两个长度为length的大整数做减法,得到的结果放到数组C中,长度为length int Sub(int a[],int b[],int c[],int length){int borrow=0;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;}//分治法求两个大整数的乘积,它只需要更少次数的乘法,但是它必须递归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;}else if(len==2){int t1=a[1]*b[1];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));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){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];}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*lDividBigIntMultiply(a0,b0,c0,l); //c0=a0*b0,长度为2*l//再来求得c1,这里有乘法也有加法,还有减法//c1=(a1+a0)*(b1+b0)-(c2+c0)int *t1,*t2,*t3,*t4,*c1;t1=(int *)malloc((1+l)*sizeof(int)); //t1=a1+a0t2=(int *)malloc((1+l)*sizeof(int)); //t2=b1+b0t3=(int *)malloc((1+2*l)*sizeof(int)); //t3=t1*t2t4=(int *)malloc(2*(l+1)*sizeof(int)); //t4=c2+c0c1=(int *)malloc(2*(l+1)*sizeof(int)); //c1=t3-t4if(t1==NULL || t2==NULL || t3==NULL){printf("内存分配失败,递归失败,程序退出!\n");exit(0);}int len1=Add(a1,a0,t1,l); //t1=a1+a0,长度为l+1int len2=Add(b1,b0,t2,l); //t2=b1+b0,长度为l+1int len4=Add(c2,c0,t4,2*l); //t4=c2+c0,长度为2*l+1int 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)//打印输出c2,c1和c0int 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++)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 len_a,len_b,len_align;len_a=InputBigInt(a); //输入大整数alen_b=InputBigInt(b); //输入大整数blen_align=AlignArray(a,len_a,b,len_b); //针对两个大整数做对齐int l=DividBigIntMultiply(a,b,c,len_align);int i=0;while(c[i]==0) i++;for(;i<l;i++)printf("%d",c[i]);printf("\n");}。