解析: 求阶乘的每位数字的和,总之,只要能求出阶乘,什么都好说。只要能求出一次积,就能求出阶乘。
只要能累加和就能求出一次积。
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 }