解析:  求阶乘的每位数字的和,总之,只要能求出阶乘,什么都好说。只要能求出一次积,就能求出阶乘。

  只要能累加和就能求出一次积。

 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, sum, i;
16     num = 1;
17     strcpy(fac[0], "1");
18     strcpy(s1, "1");     /*赋初值*/
19     factor(1000);
20     while(scanf("%d", &n) == 1){
21         if(n == 0){
22             printf("1\n");
23             continue;
24         }
25         sum = 0;
26         n--;
27         for(i = 0; fac[n][i]; i++)
28             sum += fac[n][i] - '0';
29         printf("%ld\n", sum);
30     }
31     return 0;
32 }
33 static void factor(int n)
34 {
35     int i;
36     for(i = 2; i <= n; i++){
37         large_multiply(i);
38         strcpy(fac[num],s1);
39         num++;
40     }
41 }
42 /*将s1与s2相乘,并将结果储存到s1中*/
43 static void large_multiply(int s2) 
44 {
45     int i, t;
46     char *p;
47     for(i = 0; i < N; i++)   /*s要进行累加中间字符串t,所以要先制空*/
48         s[i] = '0';
49     s[N-1] = '\0';
50     l = strlen(s1) - 1;
51     i = 0;
52     while(s2 > 0){
53         t = s2 % 10;         /*s2的末位数字*/
54         s2 /= 10;
55         i++;
56         digit_multiply(t,i);
57     }
58     for(i = 0; i < N; i++)
59         if(s[i] != '0'){
60             p = &s[i];
61             break;
62         }
63     strcpy(s1,p);
64 }
65 static void digit_multiply(int a, int p)
66 {
67     int i, j, temp;
68     for(i = 0; i < N; i++)    
69         t[i] = '0';
70     t[N-1] = '\0';
71     for(i = l, j = N - 1 - p; i >= 0; i--){
72         temp = (s1[i] - '0') * a;
73         t[j] += temp % 10;
74         t[j-1] += temp / 10;
75         if(t[j] > '9'){
76             temp = t[j] - '0';
77             t[j] = temp % 10 + '0';
78             t[j-1] += temp / 10;
79         }
80         j--;
81     }
82     for(i = N - 2; i >= 0; i--){
83         s[i] += t[i] - '0';
84         if(s[i] > '9'){
85             s[i] -= 10;
86             s[i-1]++;
87         }
88     }
89 }