JavaScript实现大数乘法算法解析

作者:青柠时间:2026-10-28 09:43:28浏览:645

本文介绍如何使用JavaScript处理超出语言表示范围的大数相乘问题。通过将数字转换为字符串,模拟竖式乘法中的逐位相乘与进位处理,结合辅助函数实现多位数加法,最终完成两个大整数的精确乘法运算。

大数乘法算法原理与实现

所谓大数,是指超出编程语言原生类型所能表示的最大范围的数值,此类数据通常需以字符串形式存储。针对两个大数相乘的实现需求,以下提供基于JavaScript的具体解决方案。


具体代码实现如下:

 
console.log(bigMut("567", "1234")); // 输出结果为 699678
function bigMut(big, common) {
big += "";
common += "";
if (big.length < common.length) {
big = [common, common = big][0];
} 
big = big.split("").reverse();
var oneMutManyRes = [];
var i = 0,
len = big.length;
for (; i < len; i++) {
oneMutManyRes[oneMutManyRes.length] = oneMutMany(big[i], common) + getLenZero(i);
} 
var result = oneMutManyRes[0];
for (i = 1, len = oneMutManyRes.length; i < len; i++) {
result = bigNumAdd(result, oneMutManyRes[i]);
} 
return result;
} 
function getLenZero(len) {
len += 1;
var ary = [];
ary.length = len;
return ary.join("0");
} 
function oneMutMany(one, many) {
one += "";
many += "";
if (one.length != 1) {
one = [many, many = one][0];
} 
one = parseInt(one, 10);
var i = 0,
len = many.length,
resAry = [],
addTo = 0,
curItem,
curRes,
toSave;
many = many.split("").reverse();
for (; i <= len; i++) {
curItem = parseInt(many[i] || 0, 10);
curRes = curItem * one + addTo;
toSave = curRes % 10;
addTo = (curRes - curRes % 10) / 10;
resAry.unshift(toSave);
} 
if (resAry[0] == 0) {
resAry.splice(0, 1);
} 
return resAry.join("");
} 
function bigNumAdd(big, common) {
big += "";
common += "";
var maxLen = Math.max(big.length, common.length),
bAry = big.split("").reverse(),
cAry = common.split("").reverse(),
i = 0,
addToNext = 0,
resAry = [],
fn,
sn,
sum;
for (; i <= maxLen; i++) {
fn = parseInt(bAry[i] || 0);
sn = parseInt(cAry[i] || 0);
sum = fn + sn + addToNext;
addToNext = (sum - sum % 10) / 10;
resAry.unshift(sum % 10);
} 
if (resAry[0] == 0) {
resAry.splice(0, 1);
} 
return resAry.join("");
} 
作者最新文章