解析: 大数乘法,不断的叠乘,不断的储存中间值。这样只要算出1000!就行了,数组能开到几百万。注意0!=1.
1 #include <stdio.h> 2 #include <string.h> 3 #define N 3000 4 static void factor(int n); /*求阶乘*/ 5 static void digit_multiply(int a, int p); 6 static void large_multiply(int s2); 7 static char s1[N]; 8 static char t[N]; /*存储中间结果的字符串*/ 9 static char s[N]; /*最终的结果*/ 10 static int l, num; 11 static char fac[1000][N]; 12 13 int main() 14 { 15 int n; 16 num = 1; 17 strcpy(fac[0], "1"); 18 strcpy(s1, "1"); /*赋初值*/ 19 factor(1000); 20 int i; 21 while(scanf("%d", &n) == 1){ 22 printf("%d!\n", n); 23 if(n == 0){ 24 printf("1\n"); 25 continue; 26 } 27 printf("%s\n", fac[n-1]); 28 } 29 return 0; 30 } 31 static void factor(int n) 32 { 33 int i; 34 for(i = 2; i <= n; i++){ 35 large_multiply(i); 36 strcpy(fac[num],s1); 37 num++; 38 } 39 } 40 /*将s1与s2相乘,并将结果储存到s1中*/ 41 static void large_multiply(int s2) 42 { 43 int i, t; 44 char *p; 45 for(i = 0; i < N; i++) /*s要进行累加中间字符串t,所以要先制空*/ 46 s[i] = '0'; 47 s[N-1] = '\0'; 48 l = strlen(s1) - 1; 49 i = 0; 50 while(s2 > 0){ 51 t = s2 % 10; /*s2的末位数字*/ 52 s2 /= 10; 53 i++; 54 digit_multiply(t,i); 55 } 56 for(i = 0; i < N; i++) 57 if(s[i] != '0'){ 58 p = &s[i]; 59 break; 60 } 61 strcpy(s1,p); 62 } 63 static void digit_multiply(int a, int p) 64 { 65 int i, j, temp; 66 for(i = 0; i < N; i++) 67 t[i] = '0'; 68 t[N-1] = '\0'; 69 for(i = l, j = N - 1 - p; i >= 0; i--){ 70 temp = (s1[i] - '0') * a; 71 t[j] += temp % 10; 72 t[j-1] += temp / 10; 73 if(t[j] > '9'){ 74 temp = t[j] - '0'; 75 t[j] = temp % 10 + '0'; 76 t[j-1] += temp / 10; 77 } 78 j--; 79 } 80 for(i = N - 2; i >= 0; i--){ 81 s[i] += t[i] - '0'; 82 if(s[i] > '9'){ 83 s[i] -= 10; 84 s[i-1]++; 85 } 86 } 87 }