zoukankan      html  css  js  c++  java
  • 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学堂-版权声明

  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/h5course/p/7566812.html
Copyright © 2011-2022 走看看