两整数相乘算法

算法需求

求两个整数相乘的算法

算法分析

将前一个数的每一位和后一个数的每一位相乘,因计算过程中涉及到满十进位的问题,所以可以通过判断相乘数的位数进行补零操作来简化这个问题,如下图所示:
在这里插入图片描述

例如计算:84 * 13
第一步计算4 * 13:
4 * 3 = 12(3在个位,不需要补零)
4 * 1 = 4 (1在十位,计算结果需要补1个零,即4*10)
结果:(4 * 1 * 10) + (4 * 3) = 52(4在个位,计算结果不需要补零)

第二步计算8 * 13:
8 * 3 = 24(3在个位,不需要补零)
8 * 1 = 8(1在十位,需要补1个零,即8*10)
结果:(8 * 1 * 10 + 8 * 3) * 10 = 1040(8在十位,计算结果需要补1个零)

最后一步:把上述几步结果值相加
结果:1040 + 52 = 1092

代码实现

// 乘法操作
public static long mutilply(String left, String right) {
	char[] leftAry = left.toCharArray();
	char[] rightAry = right.toCharArray();

	long num = 0;
	// 第二轮叠加所有的数
	for (int i = leftAry.length - 1; i >= 0; i--) {
		long total = 0;
		int startInt = leftAry[i] - '0';
		// 第一轮叠加所有的数
		for (int j = rightAry.length - 1; j >= 0; j--) {
			int result = 0;
			int endInt = rightAry[j] - '0';
			result = startInt * endInt;
			// 补零操作
			long buildNum = fillZero(rightAry.length - j - 1);
			total += result * buildNum;
		}
		long buildNum = fillZero(leftAry.length - i - 1);
		num += total * buildNum;
	}
	return num;
}

// 补零操作
private static long fillZero(int n) {
	StringBuilder builder = new StringBuilder();
	builder.append("1");
	for (int i = 0; i < n; i++) {
		builder.append("0");
	}
	return Long.parseLong(builder.toString());
}

总结

本算法中使用的数据类型为long,故相乘的结果不能超过2^63-1,否则会出现精度丢失。如果需要更大的整数相乘(无限大),则建议使用数组解决该问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值