解析:  又是输出格式费解的一道,不过,由于题目在电脑上,可以复制它的案例格式,这样是不会出错的。

  怎么求阶乘?我用的是一般的方法。

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