解析: 又是输出格式费解的一道,不过,由于题目在电脑上,可以复制它的案例格式,这样是不会出错的。
怎么求阶乘?我用的是一般的方法。
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 }