WEB前端面試真題 - 2000!大數的階乘如何計算?

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

面試真題題目

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

明確一下這些詞語和概念沒有什麼很差~一方面可以讓本身可以更專業的談論知識,另外一方面,在面試的時候也可以應對一些「愛問前端名詞」的面試官~小程序

或許這是你的第一反應

So easy!正常一個一個乘出來不就行了?微信小程序

for循環便可,再高大上點,用個遞歸不就搞定了?數組

或許這是你的第二反應

等等!大公司面試題會這麼簡單?瀏覽器

若是我沒記錯……JS有位數限制微信

不是有科學計數法麼……函數

什麼是階乘

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

5的階乘 —— 5! 等價於5*4*3*2*1遞歸

Number數字的數值範圍

在大多數瀏覽器當中:

● 最小數字是5e-324;(能夠理解爲浮點後324位)

● 最大數字是1.7976931348623157e+308;(能夠理解爲309位)

對於超過此範圍的數字,會顯示爲Infinity或 -Infinity(正無窮、負無窮)。

遞歸實現階乘

  1. function fact(maxNum) {
  2.     if (maxNum > 1) {
  3.         return maxNum * fact(maxNum - 1);
  4.     } else {
  5.         return 1;
  6.     }
  7. }
  8. var result = fact(170);
  9. console.log(result);

運行結果:7.257415615307994e+306

大數階乘如何實現

實現思路

將一個數字的每一位(個位、十位、百位、千位……)拆分出來,構成一個數組。

每次計算時,針對每一位進行數學運算,並遵循逢十進一的原則,修改數組中每個數組元素的內容。

在完成全部運算以後,能夠經過數組的join方法,將每一位鏈接起來,組成「字符串」輸出~

核心功能函數

  1. var result = [1];
  2. var maxNum = 300;
  3.  
  4. for (var num = 2; num <= maxNum; num++) {
  5.         for (var i = 0, plus = 0; i < result.length || plus != 0; i++) {
  6.  
  7.             var count = (i < result.length) ? (num * result[i] + plus) : plus;
  8.  
  9.             result[i] = count % 10;
  10.             plus = (count - result[i]) / 10;
  11.     };
  12. };
  13. console.log(result.reverse().join(""));

300! 的運算結果

300階乘輸出結果

部分代碼說明

將當前被乘數拆分爲數組,每位的位數分別進行乘法運算。

當count大於10時,進位,再讓下一位數字與之計算。此時,須要有一個變量(plus)存儲前一位獲得的餘數。

對於位數發生變化時(如結果從兩位數在計算以後變化爲三位數),當前的result長度不能知足,因此須要爲for循環增長額外的判斷條件。

更多前端開發 面試真題

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

決勝前端-微信小程序
HTML5學堂-版權聲明

相關文章
相關標籤/搜索