大整数乘法分而治之递归实现

来源:互联网 发布:opencv经典书籍知乎 编辑:程序博客网 时间:2024/05/22 15:20
在上算法课时,王晓东版的在大整数乘法那一章并没有给出具体的程序,在网上搜索大体上也是基于笔算而写出的算法,所以基于此我自己编写了一个基于递归实现的算法和大家交流下,当输入数据太大时,程序也会死掉,求解。 

源代码,编译成.cpp文件即可运行。

===========================================

#include<stdio.h>#include<string.h>#include<math.h>void display(int num[])   //大整数输出{ int i=num[0]; while(0==num[i])  i--; for(;i>=1;i--)  printf("%d",num[i]);}void align(int *num1,int *num2) //对大整数进行对阶,方便处理{/* if(num1[0]>=num2[0]) {  if(num1[0]%2==0)  {   for(int i=num2[0]+1;i<=num1[0];i++)    num2[i]=0;   num2[0]=num1[0];  }  else  {   num1[0]+=1;   num1[num1[0]]=0;   for(int i=num2[0]+1;i<=num1[0];i++)    num2[i]=0;   num2[0]=num1[0];  } } else {  if(num2[0]%2==0)  {   for(int i=num1[0]+1;i<=num2[0];i++)    num1[i]=0;   num1[0]=num2[0];  }  else  {   num2[0]+=1;   num2[num2[0]]=0;   for(int i=num1[0]+1;i<=num2[0];i++)    num1[i]=0;   num1[0]=num2[0];  } }*/ int ol,max; ol=0; max=num1[0]; if(num2[0]>max)  max=num2[0]; while(pow(2,ol)<max)  ol++; max=(int)pow(2,ol); for(int i=num1[0]+1;i<=max;i++)  num1[i]=0; for(i=num2[0]+1;i<=max;i++)  num2[i]=0; num1[0]=max; num2[0]=max; printf("max=%d\n",max);}void fun1(char *c,int *num) //处理字符串{ int i; num[0]=strlen(c); //a[0]存储数的位数 for(i=0;i<num[0];i++) {  num[num[0]-i]=c[i]-'0'; }}void add(int num1[],int num2[],int num[])  //两个大整数相加{ int i; if(num1[0]>=num2[0]) {  num[0]=num1[0];  for(i=1;i<=num2[0];i++)  {   num[i]=num1[i]+num2[i];  }  for(;i<=num[0];i++)  {   num[i]=num1[i];  }  for(i=1;i<=num[0];i++)  {   if(num[i]>=10)   {    num[i+1]+=num[i]/10;    num[i]%=10;   }  } } else {  num[0]=num2[0];  for(i=1;i<=num1[0];i++)  {   num[i]=num1[i]+num2[i];  }  for(;i<=num[0];i++)  {   num[i]=num2[i];  }  for(i=1;i<=num[0];i++)  {   if(num[i]>=10)   {    num[i+1]+=num[i]/10;    num[i]%=10;   }  } }}void addfun(int *num1,int *num2,int *num3,int *num4,int *num)   //四个大整数相加{ int temp1[1000],temp2[1000]; add(num1,num2,temp1); add(num3,num4,temp2); add(temp1,temp2,num);}void getRight(int *num,int *a,int n)   //获得num右边的n位赋给a{ a[0]=n; for(int i=1;i<=n;i++)  a[i]=num[i];}void getLeft(int *num,int *a,int n)   //获得num左边的n位赋给a{ a[0]=n; for(int i=1;i<=n;i++)  a[i]=num[i+n];}int *moveR(int *num,int n)  //十进制大数右移n位{ for(int i=1;i<=n;i++) {  for(int j=num[0];j>=1;j--)   num[j+1]=num[j];  num[i]=0;  num[0]++; } return num;}int *mult(int num1[],int num2[],int n) //大整数乘法{ int *num=new int(2*(n+1)); int a[1000],b[1000],c[1000],d[1000]; if(n==1) {  num[n]=num1[n]*num2[n];    num[0]=2;  num[2]=0;  if(num[1]>=10)  {   num[2]=num[1]/10;   num[1]%=10;  }  return num; }   else {  getLeft(num1,a,n/2);      getRight(num1,b,n/2);  getLeft(num2,c,n/2);  getRight(num2,d,n/2);  addfun(moveR(mult(a,c,n/2),n),moveR(mult(a,d,n/2),n/2),moveR(mult(b,c,n/2),n/2),mult(b,d,n/2),num);   return num; }}void main()   //主函数{ char a[1000],b[1000]; int num1[1000],num2[1000]; int *num=new int[1000]; printf("num1 = "); scanf("%s",a); printf("\n"); printf("num2 = "); scanf("%s",b); printf("\n"); fun1(a,num1); fun1(b,num2); align(num1,num2); num=mult(num1,num2,num1[0]); display(num1); printf(" * "); display(num2); printf(" = "); display(num); printf("\n");}


原创粉丝点击