超长整数字符串乘法的算法


//*******************************//
//超长整数字符串乘法的算法  //
//在vs2005下调试通过   //
//******************************//
#define MAX 10000
int a[MAX], b[4],c[MAX];

int times(int a[],int b[],int la,int lb)
//a[],b[]为两个被乘数输入,高位在前,0位不用,比a=120,则a[3]=1,a[2]=2,a[1]=0;输出c也是这样
//la,lb,lc为最高位位数,比如上例la=3;
{
 int i,j,k,re,jin=0;
 for(i=1;i<=MAX;i++)
  c[i]=0;
 for(i=1;i<=la;i++)
 {
  jin=0;
  for(j=1;j<=lb;j++)//进位乘法
  {
   re=a[i]*b[j]+jin+c[i+j-1];
    jin=re/10;
    c[i+j-1]=re%10;
    k=i+j-1;
  }
  
  while(jin>0)//考虑连续进位
  {
   k++;
   re=c[k]+jin;
   c[k]=re%10;
   jin=re/10;
  } 
 }
 return k;//返回结果的位数
}


//示例
/*
main()
{
 int i;
 a[2]=2;a[1]=2;
 b[2]=4;b[1]=4;
 printf("%d/n",times(a,b,2,2));
 for(i=3;i>=1;i--)
  printf("%d",c[i]);


}
返回3
968
*/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分治算法的基本思想是将一个大问题分解成若干个规模较小的子问题,然后采用递归的方式解决这些子问题,最后将子问题的解合并起来得到原问题的解。在大整数乘法中,可以将两个大整数分解成若干个较小的子问题,然后采用递归的方式解决这些子问题,最后将子问题的解合并起来得到原问题的解。 具体实现步骤如下: 1. 将两个大整数分别分成两部分,分别记为a1,a2和b1,b2,使得a=a1*10^(n/2)+a2,b=b1*10^(n/2)+b2,其中n为大整数的位数。 2. 递归地求解a1*b1、a1*b2、a2*b1和a2*b2。 3. 将a1*b1和a2*b2相加,得到c1。 4. 将a1*b2和a2*b1相加,得到c2。 5. 将c1和c2分别左移n/2位,得到c1*10^n和c2*10^(n/2)。 6. 将c1*10^n、c2*10^(n/2)和a2*b2相加,得到结果。 下面是Python的代码实现: ```python def multiply(num1, num2): if len(num1) == 1 or len(num2) == 1: return int(num1) * int(num2) n = max(len(num1), len(num2)) m = n // 2 a1, a2 = num1[:-m], num1[-m:] b1, b2 = num2[:-m], num2[-m:] c1 = multiply(a1, b1) c2 = multiply(a2, b2) c3 = multiply(str(int(a1) + int(a2)), str(int(b1) + int(b2))) - c1 - c2 return int(c1) * 10**(2*m) + int(c3) * 10**m + int(c2) print(multiply('12345678901234567890', '98765432109876543210')) # 12193263113702179540348199526558683136100 ``` 其中,第6步的计算可以使用第3、4、5步的结果得到。具体地,c3 = (a1+a2)*(b1+b2) - c1 - c2。这里用到了一个小技巧,即将字符串转换为数字时使用int()函数,将数字转换为字符串时使用str()函数,这样既可以进行加法运算,也可以进行字符串拼接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值