本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
设计一个函数,计算一个数的阶乘。比如计算
1*2*3*...1000
的结果。
此题在leetcode上没找到完全一样的,可以参考这道类似的题目:剑指 Offer 66. 构建乘积数组
示例 1:
输入:3
输出:6
复制代码
注意:
- 所有元素乘积之和不会溢出 32 位整数
a.length <= 100000
二、思路分析:
思路1:
对于大数问题,我们要把大数和数组结合起来,利用数组存储大数。
例如要计算50的阶乘,我们可以如此计算:
-
要先从1开始乘:
1*2=2
,将2存到a[0]中, -
接下来是用
a[0]*3
:2*3=6
,将6储存在a[0]中, -
接下来是用
a[0]*4
:6*4=24
,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中 -
接下来是用
a[0]*5
,a[1]*5+num
:4*5=20
,a[0]=0,num=2(num是进位)2*5+num=12
,a[1]=2,num=1- a[2]=1
- 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