每日一练---codewars8 Multiplying numbers as strings

178 阅读2分钟

由于某书竟然限制每天发文章数!每天限制两篇!所以在这儿留下自己的笔记,督促自己每天的学习。

这题目给的很简单 就是简单的两字符串之乘 但是难度为4kyu 上来也没管,直接写代码,感觉很简单嘛

function multiply(a, b) {
    console.log(a * b)
    return (a * b) + ''
}

结果发现,但是当数字足够大时 发现结果不会全部展示 而是会用 +e 来显示
害我以为很简单 只能另寻思路 暴力解法 类似做一个数学题,依次相乘,已经想到了 性能可能会极差 复杂度高 先看看能否实现

//       1 2 3
//   *   1 2 4
//   -----------
//         1 2        i = 2, j = 2
//         6          i = 2, j = 1
//   -----------
//         7 2        i = 2, j = 1
//   以此类推
//   ...
// 0 1 5 2 5 2
//  索引
// 0 1 2 3 4 5     一共6个数字  乘积的结果 最大不可能超过6位数

// 上代码
function multiply(a, b) {
    if(a == 0 || b == 0) return '0'
    // 创建一个空数组,来放置各个位置的值
    var arr = [];
    // 第一层循环 倒循环  先计算最后一个值
    for (var i = a.length - 1; i >= 0; i--) {
        for (var j = b.length - 1; j >= 0; j--) {
            // 索引的值 + 1,当前值所在位置
            var bigIndex = i + j + 1;
            // i + j 当前值 之前 的一个值的位置
            var smallIndex = i + j;
            // 两数相乘(这里是很小的数相乘)  如果之前数组中 已经存在乘积  则需要加上  看上面的分解  此时的 bigIndex  则是上次的 smallIndex
            var multi = a[i] * b[j] + (arr[bigIndex] || 0);
            // 直接取余 取个位的数值
            arr[bigIndex] = multi % 10;
            // 乘积除以10 看需不需要进 1 ,再加上原来的值不存在的话就为0
            arr[smallIndex] = Math.floor(multi / 10) + (arr[smallIndex] || 0)
        }
    }
    // console.log(arr.join('').replace(/^0+/,''))
    return arr.join('').replace(/^0+/,'')
}

到目前为止,已经实现了功能。但我觉得还是可以继续改进,这样做的复杂度高。继续研究,未完待续~