• WEB前端面试真题


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

    面试真题题目

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

    明确一下这些词语和概念没有什么不好~一方面能够让自己能够更专业的谈论知识,另一方面,在面试的时候也能够应对一些“爱问前端名词”的面试官~

    或许这是你的第一反应

    So easy!正常一个一个乘出来不就好了?

    for循环即可,再高大上点,用个递归不就搞定了?

    或许这是你的第二反应

    等等!大公司面试题会这么简单?

    如果我没记错……JS有位数限制

    不是有科学计数法么……

    什么是阶乘

    一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。

    5的阶乘 —— 5! 等价于5*4*3*2*1

    Number数字的数值范围

    在大多数浏览器当中:

    ● 最小数字是5e-324;(可以理解为浮点后324位)

    ● 最大数字是1.7976931348623157e+308;(可以理解为309位)

    对于超过此范围的数字,会显示为Infinity或 -Infinity(正无穷、负无穷)。

    递归实现阶乘

    1. function fact(maxNum) {
    2.     if (maxNum > 1) {
    3.         return maxNum * fact(maxNum - 1);
    4.     } else {
    5.         return 1;
    6.     }
    7. }
    8. var result = fact(170);
    9. console.log(result);

    运行结果:7.257415615307994e+306

    大数阶乘如何实现

    实现思路

    将一个数字的每一位(个位、十位、百位、千位……)拆分出来,构成一个数组。

    每次计算时,针对每一位进行数学运算,并遵循逢十进一的原则,修改数组中每一个数组元素的内容。

    在完成所有运算之后,可以通过数组的join方法,将每一位连接起来,组成“字符串”输出~

    核心功能函数

    1. var result = [1];
    2. var maxNum = 300;
    3.  
    4. for (var num = 2; num <= maxNum; num++) {
    5.         for (var i = 0, plus = 0; i < result.length || plus != 0; i++) {
    6.  
    7.             var count = (i < result.length) ? (num * result[i] + plus) : plus;
    8.  
    9.             result[i] = count % 10;
    10.             plus = (count - result[i]) / 10;
    11.     };
    12. };
    13. console.log(result.reverse().join(""));

    300! 的运算结果

    300阶乘输出结果

    部分代码说明

    将当前被乘数拆分为数组,每位的位数分别进行乘法运算。

    当count大于10时,进位,再让下一位数字与之计算。此时,需要有一个变量(plus)存储前一位得到的余数。

    对于位数发生变化时(如结果从两位数在计算之后变化为三位数),当前的result长度不能满足,所以需要为for循环增加额外的判断条件。

    更多前端开发 面试真题

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

    决胜前端-微信小程序
    HTML5学堂-版权声明

  • 相关阅读:
    原生js,实现跨越的jsonp
    nodejs+express+jade安装步骤
    浏览器端创建可下载文件
    保留有效数字
    日期转换格式
    js添加千分位
    vue 中的 全选和 反选
    防止域名被恶意解析
    node命令行工具之实现项目工程自动初始化的标准流程
    React router动态加载组件-适配器模式的应用
  • 原文地址:https://www.cnblogs.com/h5course/p/7566812.html
Copyright © 2020-2023  润新知