资讯专栏INFORMATION COLUMN

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

macg0406 / 1993人阅读

摘要:学堂码匠求某个数字的阶乘,很难吗看上去这道题异常简单,却不曾想里面暗藏杀机,让不少前端面试的英雄好汉折戟沉沙。更多前端开发面试真题更多面试真题,请移步微信小程序决胜前端

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! 的运算结果

部分代码说明

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

更多前端开发 面试真题

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/51167.html

相关文章

  • 2000! | 上去如此简单面试太多前端英雄好汉折戟

    摘要:学堂码匠求某个数字的阶乘,很难吗看上去这道题异常简单,却不曾想里面暗藏杀机,让不少前端面试的英雄好汉折戟沉沙。更多前端开发面试真题更多面试真题,请移步微信小程序决胜前端 HTML5学堂-码匠:求某个数字的阶乘,很难吗?看上去这道题异常简单,却不曾想里面暗藏杀机,让不少前端面试的英雄好汉折戟沉沙。 面试真题题目 如何求大数的阶乘(如1000的阶乘、2000的阶乘) showImg(htt...

    wawor4827 评论0 收藏0
  • 2000! | 上去如此简单面试太多前端英雄好汉折戟

    摘要:学堂码匠求某个数字的阶乘,很难吗看上去这道题异常简单,却不曾想里面暗藏杀机,让不少前端面试的英雄好汉折戟沉沙。更多前端开发面试真题更多面试真题,请移步微信小程序决胜前端 HTML5学堂-码匠:求某个数字的阶乘,很难吗?看上去这道题异常简单,却不曾想里面暗藏杀机,让不少前端面试的英雄好汉折戟沉沙。 面试真题题目 如何求大数的阶乘(如1000的阶乘、2000的阶乘) showImg(htt...

    android_c 评论0 收藏0
  • ArrayList 线程安全性学习

    摘要:线程安全吗虽然天天用,但是真的没考虑过这个问题。其实,线程不安全。没有对多线程问题进行处理,举个方法的例子就能证明它线程不安全。线程不安全的要比线程安全的执行效率高。 引言 最近学校的氛围比较活跃,考研的复习,不考研的都在写简历准备面试。 看了看,最近也没有好公司来办宣讲会,也就没了投简历的意向。最近看了看面试题,想着补一补基础,以后面几家Spring Cloud的企业,去和面试官交流...

    genedna 评论0 收藏0
  • HTML-CSS

    摘要:但是,从字体上来说雪碧图制作,使用以及相关,图文。由于采用了编译,所以能够保证在浏览器不支持标准布局的情况下,回滚到旧版本的,保证移动设备中能呈现出一样的布局效果。我不想陷入和的纷争,但是有一件事是确定的极大的提升了移动端 一劳永逸的搞定 flex 布局 寻根溯源话布局 一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平、垂直同时居中。记得刚开始学习 CSS 的时候,看到 ...

    xiaokai 评论0 收藏0

发表评论

0条评论

macg0406

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<