2000! | 看上去如此簡單的面試題,讓太多「前端」英雄好漢折戟

HTML5學堂-碼匠:求某個數字的階乘,很難嗎?看上去這道題異常簡單,卻未曾想裏面暗藏殺機,讓很多前端面試的英雄好漢折戟沉沙。前端

面試真題題目

如何求「大數」的階乘(如1000的階乘、2000的階乘)面試

圖片描述

什麼是階乘

一個正整數的階乘(英語:factorial)是全部小於及等於該數的正整數的積,而且0的階乘爲1。
5的階乘 5! 等價於
54321小程序

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! 的運算結果

clipboard.png

部分代碼說明

將當前被乘數拆分爲數組,每位的位數分別進行乘法運算。
當count大於10時,進位,再讓下一位數字與之計算。此時,須要有一個變量(plus)存儲前一位獲得的餘數。
對於位數發生變化時(如結果從兩位數在計算以後變化爲三位數),當前的result長度不能知足,因此須要爲for循環增長額外的判斷條件。函數

更多前端開發 面試真題

更多面試真題,請移步微信小程序 —— 決勝前端spa

圖片描述

clipboard.png

clipboard.png

相關文章
相關標籤/搜索