算法:我认识的大数相乘(整数场景)

687 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

昨天在不经意之间看到了一个这的题目:实现一个大数相乘的方法(只需考虑整数场景),我当时在想,这个不就是我们数学中的乘法计算吗?让我们看一张图(灵魂画手,请见谅😅😅)

image.png

上图就是我们数学中的乘法计算方式。但是我们该如何把它演化为我们的可供计算机运行的代码呢。一时间还是让我有点不知所措,不过,莫慌,我们先来分析一波。

计算分析

我们有两个纯数字的字符串:

var a = 121;
var b = 102;

这两个字符串的长度都是3,

从上图看我们可以发现它的计算过程是这样:

  1. 得到两个字符串的长度
  2. 循环嵌套去遍历两个个字符串
  3. 每次遍历都用外层的数字和内层的相乘
  4. 拿到后一位的值,没有值就用 0,然后第3部的相乘结果相机,就得到了本轮后结果
  5. 将结果取整后加上当前当前位置的值得到前一位的值;结果取余得到后一位的值

代码实现

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'

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏。