分治算法之大整数相乘问题

本文详细探讨了使用分治算法解决大整数相乘问题的方法,从问题描述、分析到解决方案的逐步展开,包括位的整数相乘、移位操作和大数加法。同时,介绍了如何利用Java类库如BigInteger进行大数处理的便捷方式。
摘要由CSDN通过智能技术生成

1.问题描述

求两个大数A、B乘积的准确结果

其中A和B均为100位以上的十进制整数

A和B的位数可以不相等


2.问题分析

(1)

100位以上的整数,用整数变量直接存储装不下

所以,中间运算时,牵扯到大数肯定当做字符串来存储

(2)

A和B直接乘操作肯定是操作不了,必须是分开来处理

可以二分法,将AB转换

A=A1*10^(n1/2) +A0 —– n1为a的位数

B=B1*10^(n2/2)+B0 —–n2为b的位数

那么 A*B={A1*10^(n1/2)+A0}*{B1*10^(n2/2)+B0}

化简得

 A*B= 
(A1*B1)*10^[(n1+n2)/2] 
+(A1*B0)*10^(n1/2) 
+(A0*B1)*10^(n2/2) 
+(A0*B0)

那么就把 n1 位的整数与 n2位的整数相乘的问题转化为

1.四个`n1/2`位的整数和`n2/2`位的整数相乘

2.三次移位

3.四次“大数”加法

3.问题解决

(1)n1/2位的整数和n2/2位的大整数相乘

问题又回到了原点——大整数相乘问题

问题的解决需要调用自身来解决——递归

(2)移位

移位相当于是在后边补0

那么就在要移位的数(字符串)后面添加一定量的0即可

(3)“大数”加法

因为中间操作的都是比较大的数,因此即使是中间值的相加,也是比较大的数,故要采用大数相加

大数相加 问题 参见 大数相加


4.代码实现

import java.math.BigInteger;
import java.util.Scanner;
import org.stone.stack.MyBigAdd;
/**
 * @ClassName_MyBigIntegerMutiply
 * @author_Stone6762
 *
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值