2000! | 看上去如此简单的面试题,让太多“前端”英雄好汉折戟

HTML5学堂-码匠:求某个数字的阶乘,很难吗?看上去这道题异常简单,却未曾想里面暗藏杀机,让很多前端面试的英雄好汉折戟沉沙。前端

面试真题题目

如何求“大数”的阶乘(如1000的阶乘、2000的阶乘)面试

图片描述

什么是阶乘

一个正整数的阶乘(英语:factorial)是全部小于及等于该数的正整数的积,而且0的阶乘为1。
5的阶乘 5! 等价于
54321小程序

Number数字的数值范围

在大多数浏览器当中:
● 最小数字是5e-324;(能够理解为浮点后324位)
● 最大数字是1.7976931348623157e+308;(能够理解为309位)
对于超过此范围的数字,会显示为Infinity或 -Infinity(正无穷、负无穷)。微信小程序

递归实现阶乘

function fact(maxNum) {
    if (maxNum > 1) {
         return maxNum * fact(maxNum - 1); 
    } else {
         return 1;
    }
}
var result = fact(170);
console.log(result);

运行结果:
7.257415615307994e+306数组

对于170!如下的阶乘,是能够使用递归实现的,对于大于170的数字,阶乘数已超出范围,会显示为Infinity浏览器

大数阶乘如何实现

实现思路

将一个数字的每一位(个位、十位、百位、千位……)拆分出来,构成一个数组。
每次计算时,针对每一位进行数学运算,并遵循逢十进一的原则,修改数组中每个数组元素的内容。
在完成全部运算以后,能够经过数组的join方法,将每一位链接起来,组成“字符串”输出~微信

核心功能函数

var result = [1];
var maxNum = 300;

for (var num = 2; num <= maxNum; num++) {
      for (var i = 0, plus = 0; i < result.length || plus != 0; i++) {
            
          var count = (i < result.length) ? (num * result[i] + plus) : plus;

          result[i] = count % 10;
          plus = (count - result[i]) / 10;
    };
};
console.log(result.reverse().join(""));

300! 的运算结果

clipboard.png

部分代码说明

将当前被乘数拆分为数组,每位的位数分别进行乘法运算。
当count大于10时,进位,再让下一位数字与之计算。此时,须要有一个变量(plus)存储前一位获得的余数。
对于位数发生变化时(如结果从两位数在计算以后变化为三位数),当前的result长度不能知足,因此须要为for循环增长额外的判断条件。函数

更多前端开发 面试真题

更多面试真题,请移步微信小程序 —— 决胜前端spa

图片描述

clipboard.png

clipboard.png

相关文章
相关标签/搜索