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

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

面试真题题目

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

或许这是你的第一反应

You

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

码匠好友

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

或许这是你的第二反应

You

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

码匠好友

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

You

不是有科学计数法么……

什么是阶乘

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

5的阶乘 5! 等价于

5*4*3*2*1

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循环增加额外的判断条件。

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

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2017-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

[每日一题]宏定义

前面题目主要是自定义函数的题,相信经过这些题目的训练,大家对自定义函数的理解想必更近了一步。接下来呢,我们主要来练习跟自定义函数异曲同工的宏定义,先看看下面这题...

3286
来自专栏刘笑江的专栏

SCIP学习笔记

2094
来自专栏码云1024

RandomAccessFile&IO流&排序&方法论

2737
来自专栏小詹同学

【记录帖】(No.002)从零打卡刷Leetcode

小詹一直觉得自己编程能力不强,想在网上刷题,又怕不能坚持。不知道有木有和小伙伴和小詹一样想找个人一起刷题呢?欢迎和小詹一起定期刷leetcode,每周一周五更新...

1234
来自专栏专知

【Leetcode 303】关关的刷题日记67–Leetcode 303 Range Sum Query – Immutable

关关的刷题日记67 – Leetcode 303 Range Sum Query – Immutable 题目 Given an integer array n...

2908
来自专栏专知

【LeetCode 459】关关的刷题日记42 – Repeated Substring Pattern

关关的刷题日记42 – Leetcode 459. Repeated Substring Pattern 题目 Given a non-empty string...

3646
来自专栏Python数据科学

如何用Python递归地思考问题?

递归是一个很经典的算法,在实际中应用广泛,也是面试中常常会提到的问题。本文就递归算法介绍如何在Python中实现递归的思想,以及递归在Python中使用时的一些...

2965
来自专栏好好学java的技术栈

轻松看懂java设计模式简单工厂模式

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

1322
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)第五章 Kotlin 面向对象编程(OOP)1. 面向对象的HelloWorld 2. 面向对象编程思想简述3.Kotlin 面向

Kotlin 同Java、 Scala、Groovy 一样,都使用关键字class 来定义类。

1303
来自专栏小樱的经验随笔

BZOJ 3670: [Noi2014]动物园【KMP变形 】

3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 2738  Solve...

3337

扫码关注云+社区