题目传送门
题目大意
计算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.乘积在数组中存储的为逆序,即个位在最前面,输出时需要逆序。