WEB前端面试真题 - 2000!大数的阶乘如何计算?
2017-09-21 09:24
501 查看
HTML5学堂-码匠:求某个数字的阶乘,很难吗?看上去这道题异常简单,却不曾想里面暗藏杀机,让不少前端面试的英雄好汉折戟沉沙。
明确一下这些词语和概念没有什么不好~一方面能够让自己能够更专业的谈论知识,另一方面,在面试的时候也能够应对一些“爱问前端名词”的面试官~
for循环即可,再高大上点,用个递归不就搞定了?
如果我没记错……JS有位数限制
不是有科学计数法么……
5的阶乘 —— 5! 等价于5*4*3*2*1
● 最小数字是5e-324;(可以理解为浮点后324位)
● 最大数字是1.7976931348623157e+308;(可以理解为309位)
对于超过此范围的数字,会显示为Infinity或 -Infinity(正无穷、负无穷)。
if (maxNum > 1) {
return maxNum * fact(maxNum - 1);
} else {
return 1;
}
}
var result = fact(170);
console.log(result);
运行结果:7.257415615307994e+306
每次计算时,针对每一位进行数学运算,并遵循逢十进一的原则,修改数组中每一个数组元素的内容。
在完成所有运算之后,可以通过数组的join方法,将每一位连接起来,组成“字符串”输出~
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(""));
当count大于10时,进位,再让下一位数字与之计算。此时,需要有一个变量(plus)存储前一位得到的余数。
对于位数发生变化时(如结果从两位数在计算之后变化为三位数),当前的result长度不能满足,所以需要为for循环增加额外的判断条件。
分类: JavaScript,就业与面试
面试真题题目
如何求“大数”的阶乘(如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循环增加额外的判断条件。
更多前端开发 面试真题
更多面试真题,请移步微信小程序 —— 决胜前端分类: JavaScript,就业与面试
相关文章推荐
- WEB前端面试真题 - 2000!大数的阶乘如何计算?
- WEB前端开发 辨析类 面试真题 大集锦
- 决胜前端 —— 数百道 WEB前端面试真题 的集结地
- Web前端面试指导(十四):如何居中一个元素(正常、绝对定位、浮动元素)?
- Web前端面试指导(十七):一个满屏 品 字布局 如何设计?
- WEB前端开发 辨析类 面试真题 大集锦
- Web前端面试指导(三十四):如何实现浏览器内多个标签页之间的通信?
- Web前端面试指导(二十):JavaScript中如何翻转一个字符串?
- 这篇文章挺有意思 关于如何自学web前端以及一些面试的经验分享
- Web前端面试指导(二十一):如何向数组中间插入或删除元素?
- Web前端面试指导(四十二):如何在页面上实现一个圆形的可点击区域?
- Web前端面试指导(二十九):Ajax 是什么? 如何创建一个Ajax?
- Web前端面试指导(十九):CSS样式-如何清除元素浮动?
- 如何面试Web前端开发
- Web前端面试指导(二十四):事件是什么?如何阻止事件冒泡?
- WEB前端底层知识之浏览器是如何工作的(4)--Render树与CSS解析
- 大数阶乘的计算(三)
- WEB前端底层知识--浏览器是如何工作的
- 柯南君:教你如何对待大型网站平台的性能优化? 之 五---web 前端性能优化策略(长篇总结)
- 大数阶乘的计算(四)