本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
设计一个函数,计算一个数的阶乘。比如计算
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























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)