WEB前端面试真题 - 2000!大数的阶乘如何计算?
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(正无穷、负无穷)。
递归实现阶乘
- function fact(maxNum) {
- if (maxNum > 1) {
- return maxNum * fact(maxNum - 1);
- } else {
- return 1;
- }
- }
- var result = fact(170);
- console.log(result);
运行结果:7.257415615307994e+306
大数阶乘如何实现
实现思路
将一个数字的每一位(个位、十位、百位、千位……)拆分出来,构成一个数组。
每次计算时,针对每一位进行数学运算,并遵循逢十进一的原则,修改数组中每一个数组元素的内容。
在完成所有运算之后,可以通过数组的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循环增加额外的判断条件。
更多前端开发 面试真题
更多面试真题,请移步微信小程序 —— 决胜前端
WEB前端面试真题 - 2000!大数的阶乘如何计算?的更多相关文章
- 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附答案
2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...
- web前端面试试题总结---其他
其他问题 原来公司工作流程是怎么样的,如何与其他人协作的?如何夸部门合作的? 你遇到过比较难的技术问题是?你是如何解决的? 设计模式 知道什么是singleton, factory, strategy ...
- 拼多多后台开发面试真题:如何用Redis统计独立用户访问量
众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过1 ...
- 拼多多面试真题:如何用 Redis 统计独立用户访问量!
阅读本文大概需要 2.8 分钟. 作者:沙茶敏碎碎念 众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作 3 年的开发,稍微优秀一点的,都给到 30K 的 Offer. 当然,拼 ...
- 大厂0距离:网易 Linux 运维工程师面试真题,内含答案
作为 Linux 运维工程师,进入大公司是开启职业新起点的关键,今天马哥 linux 运维及云计算智囊团的小伙伴特别分享了其在网易面试 Linux 运维及云计算工程师的题目和经历,希望对广大 Linu ...
- web前端面试试题总结---html篇
HTML Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器 ...
- web前端面试总结
本文由我收集总结了一些前端面试题,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习.透彻学习,形成自己的知识链.万不可投机取巧,临时抱佛脚只求面试侥幸混过关是错误的!也是不可能的! 前端还是一个 ...
- Web前端面试笔试题总结
最近一段时间要毕业了,忙着找工作,见过不少笔试面试题,自己总结了一些加上网上找的一些整合了一下.答案暂时都东拼西凑出来了,但是还是先不发出来,一方面是答案并不是唯一的并且自己的答案不能保证对,另一方面 ...
- 百度web前端面试2015.10.18
邮件里通知的周日下午两点参加百度校招面试,我13:10分就到了,前台先让我拿了个面试资格单(上面是我的信息),然后在web前端面试入口排队,面试在百度食堂举行的,等了大概1个小时,放我去面试.都是一对 ...
随机推荐
- 在微信小程序的JS脚本中使用Promise来优化函数处理
在我们传统的Javascript开发函数编写中,我们习惯了回调函数的处理,不过随着回调函数的增多,以及异步处理的复杂性等原因,代码越来越难读,因此诞生了使用Promise来优化JS函数处理的需求,引入 ...
- Firefox插件推荐
介绍一下我常用的几个Firefox插件,不一定适合所有人. 图中所示4个插件是我仅有的4个addons,除了stylish,其他几个已经伴随我多年. 1.Adblock Plus(强烈推荐) 广告拦截 ...
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
组合模式 组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 如果有一个 ...
- 专业运维配的vsftpd.conf
需要另外写userlist,下面的配置文件可以参考,这是使用云镜像市场的全能java环境装的机. [root@VM_1_202_centos vsftpd]# cat vsftpd.conf # Ex ...
- 线性代数-矩阵-【2】矩阵生成 C和C++实现
矩阵的知识点之多足以写成一本线性代数. 所以我们把矩阵的运算封装成矩阵类.以C++为主进行详解. 点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Lia ...
- Javascript中的浅拷贝和深拷贝
很多开发语言中都有浅拷贝和深拷贝的说法,这里简单区分一下它们在Javascript中的区别,以及jQuery中深拷贝的实现. 在谈浅拷贝和深拷贝之前,先要屡清楚Javascript中的按值访问和按引用 ...
- AOP入门之静态代理
代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及 ...
- vs下开端口直接调试iis
有些时候我们接口调试不想发布然后挂到iis下面,因为这样子调试有点麻烦,不是不可以调试.当然我们就希望在vs下直接运行直接打断点调试! 只需要三步就可以实现: 1) 找到这个文件 2) 打开上面文 ...
- kettle表输入条件参数设置
@ 获取系统信息:设置命令参数 @ 表输入:
- Codis分布式锁
近期一项需求需要使用分布式锁,考虑的方案主要有如下两种: zookeeper codis 因为对于zookeeper不是特别熟悉,因此选用了codis,Codis是一个分布式的Redis解决方案,从应 ...