解析:  大数乘法,不断的叠乘,不断的储存中间值。这样只要算出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 }