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 条评论
登录 后参与评论

相关文章

来自专栏专知

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

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

3516
来自专栏代码世界

Python之面向对象一

引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blo...

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

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

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

1163
来自专栏Java3y

十道简单算法题

前言 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下,重温一下。 只能说慢慢积累吧~下面的题目难度都...

1K8
来自专栏码云1024

RandomAccessFile&IO流&排序&方法论

2707
来自专栏cs

递归算法

据说凡是可以循环的步骤,都可以递归表示出来。 递归的关键有二点: 1.0 递归公式,即递推式。 2.0 递归出口。 ---- 递归求数组的和 package...

3515
来自专栏专知

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

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

2788
来自专栏NetCore

关于今天很热的--FizzBuzzWhizz

今天早上到现在看到了3篇关于FizzBuzzWhizz的问题,第一篇是@程序媛想事儿(Alexia)【最难面试的IT公司之ThoughtWorks代码挑战——F...

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

[每日一题]宏定义

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

3146
来自专栏BaronTalk

Java8新特性第3章(Stream API)

Stream作为Java8的新特性之一,他与Java IO包中的InputStream和OutputStream完全不是一个概念。Java8中的Stream是对...

34910

扫码关注云+社区