思路
求 N 的階乘,階乘大家都會,這道題考的就是大數,因爲 N 的取值達到了10000,那麼他的結果的位數就已經達到了上萬了。
所以就是模擬大數乘法,因爲階乘時,一個數很大,另一個數是相對較小的,所以思路是比較簡單的。
具體的思路就是,以前計算乘法時是用一個數的每一位去乘另一個數,然後按照一定的規則進行相加。現在我們直接用小數去乘大數的每一位,進位的時候不再侷限是個位數,而是直接進位除 10 後的結果。
這樣的話,如果只進行 大數的位數次 乘法運算的話,第一位的數字經過累積就會非常大,所以每次計算時完成後,要將首位向前分解。
細節見代碼……
代碼
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int num[50000];
int main()
{
int n, temp, len = 0;
int i, j, up;
while(scanf("%d", &n)!=EOF)
{
if(n==0)
{
// 0 的階乘爲 1,wa了好長時間,數學渣
printf("1\n");
continue;
}
memset(num, 0, sizeof(num));
num[0] = 1;
len = 0;
for(i=2; i<=n; i++)
{
for(j=0, up=0; j<=len; j++)
{
temp = num[j] * i + up;
num[j] = temp%10;
up = temp/10;
}
// 向前分解,直到首位爲個位數
for(; ; j++)
{
if(up==0)
{
len = j-1;
break;
}
num[j] = up%10;
up /= 10;
}
}
for(i=len; i>=0; i--) printf("%d", num[i]);
printf("\n");
}
return 0;
}