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

在上算法课时,王晓东版的在大整数乘法那一章并没有给出具体的程序,在网上搜索大体上也是基于笔算而写出的算法,所以基于此我自己编写了一个基于递归实现的算法和大家交流下,当输入数据太大时,程序也会死掉,求解。 

源代码,编译成.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");
}
    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/xbmuzlm/article/details/6907259
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞