模拟竖式计算大数相乘

算法构思

计算十进制相乘,小学时便已学过竖式计算的方法,就是使用一个乘数的每一位去与另一个乘数的每一位相乘,之后再将对应项相加,如果出现大于9的数要进位,最终求得结果。本题所采用的算法即是对上述过程的模拟。

算法原理

本题使用模拟竖式计算的方法,将每一个大数都划分成几个小部分,每部分最多为8位,之后分别计算每个小部分相乘的结果,并将对应的项相加,最终求得大数相乘的结果。整个过程可如下表示:
[a][b]=a*10^8+b, [a][b][c]=a*10^16+b*10^8+c 等以此类推,则两个8位以上大数(小于16位)相乘的过程可简单表述如下

[a][b]*[c][d]
=(a*10^8+b)*(c*10^8+d)
=ac*10^16+(bc+ad)*10^8+bd
=ac*10^16+(bc+ad+bd/10^8)*10^8+bd%10^8
=(ac+((bd/10^8+bc+ad)/10^8))*10^16+((bc+ad+bd/10^8)%10^8)*10^8+bd%10^8
=[ac+(bd/10^8+bc+ad)/10^8][(bc+ad+bd/10^8)%10^8][bd%10^8]

其他大数相乘过程类似,由此,不难证明此算法最后结果是无误的

实现要点

//Multiply and add the corresponding parts of two numbers
for (i = 0; i <= lena; ++i) {
	for (j = 0; j <= lenb; ++j) {
		result[i + j] += a[i] * b[j];
	}
}
//solve the situation where an element is larger than 10^8
for (i = 0; i <= (lena + lenb); ++i) {
	if (result[i] >= 100000000L) {
		result[i + 1] += result[i] / 100000000L;
		result[i] %= 100000000L;
	}
}

此段代码为算法的核心代码,由于两个大数在a,b这两个数组中是逆序存储的——a[0],b[0]分别存储两个数字的最后八位,以此类推,对应项相加的过程可直接等效于 result[i + j] += a[i] * b[j],之后对result数组从低到高判断是否需要向上进位并操作即可。

数据结构

本次主要使用long long 数组来存储大数各个部分,由于long long的范围是-263 – 263-1 ,约为 9*1018 次方,因此每个小部分最多只有8位,这样两个小部分的乘积不超过10^16,即便考虑到之后各个对应项还需相加,相加后的结果也不会溢出long long的范围,保证程序在运行时的正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值