「算法」大数阶乘 | 刷题打卡

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

设计一个函数,计算一个数的阶乘。比如计算1*2*3*...1000的结果。

此题在leetcode上没找到完全一样的,可以参考这道类似的题目:剑指 Offer 66. 构建乘积数组

示例 1:

输入:3
输出:6
复制代码

注意:

  • 所有元素乘积之和不会溢出 32 位整数
  • a.length <= 100000

二、思路分析:

思路1:

对于大数问题,我们要把大数和数组结合起来,利用数组存储大数。

例如要计算50的阶乘,我们可以如此计算:

屏幕快照 2021-04-16 下午6.51.50.png

  • 要先从1开始乘:1*2=2,将2存到a[0]中,

  • 接下来是用a[0]*32*3=6,将6储存在a[0]中,

  • 接下来是用a[0]*46*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中

  • 接下来是用a[0]*5a[1]*5+num

    1. 4*5=20,a[0]=0,num=2(num是进位)
    2. 2*5+num=12,a[1]=2,num=1
    3. a[2]=1
    4. a = [0,2,1]

……………….

直到乘到50,将每一位数储存为止。

三、完整代码:

思路1:

function fn(nums) {
  let res = [1],
    count = 1,
    index = 0,
    carry = 0
  while (count <= nums) {
    index = 0
    while (index < res.length) {
      res[index] = res[index] * count + carry
      if (res[index] > 10) {
        carry = parseInt(res[index] / 10)
        res[index] = res[index] % 10
      } else {
        carry = 0
      }
      index++
    }
    if (carry != 0) {
      res.push(carry)
      carry = 0
    }
    count++
  }
  return res.reverse().join('')
}
复制代码

四、总结:

遇到大数问题要想着用数组来存储数据,以避免结算结果溢出 32 位整数的问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享