小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
昨天在不经意之间看到了一个这的题目:实现一个大数相乘的方法(只需考虑整数场景),我当时在想,这个不就是我们数学中的乘法计算吗?让我们看一张图(灵魂画手,请见谅😅😅)
上图就是我们数学中的乘法计算方式。但是我们该如何把它演化为我们的可供计算机运行的代码呢。一时间还是让我有点不知所措,不过,莫慌,我们先来分析一波。
计算分析
我们有两个纯数字的字符串:
var a = 121;
var b = 102;
这两个字符串的长度都是3,
从上图看我们可以发现它的计算过程是这样:
- 得到两个字符串的长度
- 循环嵌套去遍历两个个字符串
- 每次遍历都用外层的数字和内层的相乘
- 拿到后一位的值,没有值就用
0,然后第3部的相乘结果相机,就得到了本轮后结果 - 将结果取整后加上当前当前位置的值得到前一位的值;结果取余得到后一位的值
代码实现
function multiply(num1, num2) {
if(isNaN(num1) || isNaN(num2)) return ''
let len1 = num1.length
let len2 = num2.length
let ans = [] // 存储遍历的计算的结果
// 模拟数据计算方式,从后往前依次循环计算
for (let i = len1 - 1; i >= 0; i--) {
for (let j = len2 - 1; j >= 0; j--) {
let index1 = i + j,
index2 = i + j + 1
// 两个数相乘,取后一位上的数字相加得到本次循环中,两个位值的结果
let mul = num1[i] * num2[j] + (ans[index2] || 0)
// 前一位取整 加上 该位置的值
ans[index1] = Math.floor(mul / 10) + (ans[index1] || 0)
// 后一位取余即可
ans[index2] = mul % 10
}
}
let result = ans.join('').replace(/^0+/,'')
return !result ? '0' : result
}
测试
var num1 = '546212878237823';
var num2 = '42362078923598';
multiply(num1, num2)
// '23138713056996282390890847154'
结语
如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。
文章如有错误之处,希望在评论区指正🙏🙏。