演算法實現求n的階乘(防止溢位)

2021-07-24 08:24:58 字數 1022 閱讀 3207

求大整數n階乘,在找工作筆試和面試的過程中,不止一次遇到這個問題,用乙個for迴圈迭代出的結果肯定是不行的,即直接用int,預設是32位,它能表示的最大值為2,147,483,647,但是12的階乘為479,001,600,13的階乘為6,227,020,800,所以當n為13的時候已經溢位了。所以當n為更大的值時,需要採用巧妙的方法來防止溢位。

我們可以用陣列的方式來儲存每一位資料。

具體**如下:

#include #include #define max 40000  

using namespace std;

int main(void)

while(h>0) //如果h不為0

p = j - 1 ; //將當前的位數賦給p

} for(i=p;i>=2;i--)

printf("%d\n",a[i]);

} return 0;

}

直接看**比較難理解,可以舉個例子,比如說我們現在得到了4!= 24,在陣列中是以倒序的方式儲存,即42,a[1] =  4,a[2] = 2(陣列下標從1開始),現在要計算5!,內層for迴圈對目前的兩位4和2進行處理,即每一位都乘以5,首先a[1] = a[1]*5 + 0(h)= 20,h從0變為2,a[1] = 0;然後a[2] = a[2] * 5 + 2 = 12,h從2變為1,a[2] = 2;這時內層for迴圈執行結束。

總結1:內層for迴圈的作用是更新已經存在的位數中的每一位與i的乘積的結果.

接著執行while迴圈,目前h = 1,a[3] = 1,h 從1變為0,然後退出while迴圈。處理結束就得到了5! = 120.p的位數增加到3.

總結2:while迴圈的作用是計算p更新之前的位數之後的進製,比如說p = 2的時候,陣列中為42,然後內層for迴圈把42更新為02,while迴圈增加進製1,整個陣列變為021.

這樣就可以計算任意數的階乘,而不用擔心溢位,自己的一點總結,積累知識,溫故而知新,為自己加油!

演算法實現求n的階乘(防止溢位)

求大整數n階乘,在找工作筆試和面試的過程中,不止一次遇到這個問題,用乙個for迴圈迭代出的結果肯定是不行的,即直接用int,預設是32位,它能表示的最大值為2,147,483,647,但是12的階乘為479,001,600,13的階乘為6,227,020,800,所以當n為13的時候已經溢位了。所以...

8,演算法題 求N的階乘

這道演算法題一般考查的遞迴的程式設計技能,那麼我們回顧下遞迴程式的特點 1,什麼是遞迴?遞迴,就是方法內部呼叫方法自身 遞迴的注意事項 找到規律,編寫遞迴公式 找到出口 邊界值 讓遞迴有結束邊界 注意 如果遞迴太多層,或者沒有正確結束遞迴,則會出現 棧記憶體溢位error 問題 為什麼會出現棧記憶體...

求N階乘的長度

給乙個數x,len log10 x 1就是x這個數的長度 當n的值不超過10 6時 那麼n的階乘長度 log10 1 2 3 4 n 1 log10 1 log10 2 log10 3 log10 4 log10 n 1 include includeint main 當n比較大時,再用上面這種方法...