N (大數階乘)

2021-10-02 02:43:56 字數 1759 閱讀 7603

given an integer n(0 ≤ n ≤ 10000), your task is to calculate n!

input

one n in one line, process to the end of file.

output

for each n, output n! in one line.

sample input12

3sample output12

6一萬的階乘,想想就恐怖,當然longlong也不夠折騰的,在網上查了半天,看到乙個靠譜的回答,非常感謝博主,把鏈結貼出來了(

我就是在這裡學的,也是看了好久才看明白,能大概知道其中一些關鍵步驟的巧妙,在這裡做個梳理吧,這題思路大概是模擬人手算乘法的步驟,用陣列每乙個元素代表乙個位,a[0]就是個位a[1]就是十位以此類推,比較巧妙的是如何處理進製這類的運算。首先開乙個陣列來盛納階乘的結果,每個特定元素代表階乘特定位數上的數字(0-9),初始化a[0]=1,位數l=1,位數比較巧妙(坑1),後續再說,

之後開搞!!

(1)用乙個迴圈遍歷2–n之間所有階乘需要乘的數字。

(2)這一步是對於乙個特定的數字(0–n之間的)我們該如何處理,也就是說如何讓它模擬手算的步驟。初始化num=0,後續在討論num的巧妙(坑2),現在經過第一步,我們面前已經擺上了乙個需要乘的數字,也就是i,我們如何模擬乘法進製呢?答案就是讓我們手上已經獲得的陣列,也就是這個數i之前的階乘,讓這個陣列中的每一位都乘上這個數字i,想想乘法是不是這個道理,可能你會想手算乘法的話每次只用乘乙個數啊,怎麼會用位數上的數字去直接乘那個數的所有位?這句話好像太繞了,用圖來幫助理解一下

比如正常的11階乘結果39916800乘12,本應該82進製然後62進製類推,而我們現在討論的方法是812進製然後612進製,其實沒什麼大區別,只不過你繞不過那個彎,一位一位乘跟直接乘,只要進製得當(num的巧妙喲),也是能得到正確答案的,不多嘮叨了,繼續進行。我們用乙個迴圈依靠j和位數l的限制關係來遍歷所有位數,用t代表每一位上的數字(0–9)乘上i的結果,同時還要加上num(第一次的話初始化為0),乘出的可能很多位,就比如上圖的9*12=108,怎麼合理進製呢?個位能留的當然用t%10,之後的都是要分別進製的,但不至於單獨弄,在j++到下一位時直接加上就好(填了坑2),所以t=a[j]*i+num;這裡在迴圈結束時等於說每一位都乘過了i,但最高位乘i之後還沒有進行進製(因為t=a[j]*i+num嘛,j都超了肯定沒法進製了)所以我們再用乙個迴圈來處理剩下的進製,也就是

while(num)

這裡l就拓寬上界也合適的處理了進製的問題。

之後就是輸出了,沒什麼好說的,下面看完整**吧!

#include

#include

#include

using

namespace std;

intmain()

,i,l,t,num;

//t每次的運算數

a[0]

=1; l=1;

//l是位數

for(i=

2;i<=n;i++

)//i遍歷階乘的所有數

while

(num)

}for

(i=l-

1;i>=

0;i--

) cout<

; cout<

}return0;

}

感謝**!!!

N的階乘 大數階乘

輸入n求n的階乘的準確值。input 輸入n 1 n 10000 output 輸出n的階乘 首先,要確定n的階乘的數字大概有多少位,這樣便於我們去選擇合適的演算法。階乘 當n 10000時,上式值為35660 已經向上取整 所以接受 include include include include ...

大數n的階乘

求算n 對於比較小的n,求其階乘的時候可以用遞迴解決。但是如果n很大的時候,比如1000,那麼n 肯定超出整形資料所能表示的範圍。因此必須採用其它方法解決,通常解決大數運算資料超出範圍的問題時採用陣列去模擬。其實求算n 可以看成是每次兩個整數相乘的過程,因此可以模擬成大數相乘的過程。只是需要增加一些...

N的階乘 大數運算

題目位址 description given an integer n 0 n 10000 your task is to calculate n one n in one line,process to the end of file.for each n,output n in one line...