[ACM] hdoj1042 N! 解題報告
阿新 • • 發佈:2019-02-08
題目傳送門
題目大意
計算n!,其中n的取值範圍為0 <= n <= 10000。
解題思路
10000!結果的位數可以通多hdoj1018計算出來,其結果為35660位,因此,本題為大數乘法運算。
可採用模擬手算的方法計算該題目。
解題程式碼
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i, j; int n; int len; int num[36000]; // 儲存計算結果的陣列 while(scanf("%d", &n) != EOF) { memset(num, 0, sizeof(num)); num[0] = 1; num[1] = 1; for(i = 2; i <= n; i++) { len = num[0]; for(j = 1; j <= len; j++) { num[j] *= i; //每一位乘以i } for(j = 1; j <= num[0]; j++) { if(num[j] > 9) //進位 { num[j + 1] += num[j] / 10; num[j] = num[j] % 10; } if(num[num[0] + 1] != 0) //乘積位數擴充套件 { num[0] += 1; } } } for(i = num[0]; i > 0; i--) { printf("%c", num[i] + '0'); } printf("\n"); } return 0; } /**************************** *@problemID :1042 *@language :C++ *@Exe.Time :2652ms *@Exe.Memory:1748k *@Code.Len :659B *****************************/
注意
1.乘積在陣列中儲存的為逆序,即個位在最前面,輸出時需要逆序。