求100的阶乘

这个问题其实并不难,主要是要采用合理的数据结构。

我用的是数组,int mul[1000],并将每个元素限定在 unit = 100 即 100 进制。

效率的确是有待改进,不过除非你要算宇宙的大小,否则耗时可以忽略不计。

关键是简短易懂,可移植。 

1 #include <stdio.h>
2
3  #define UNIT 100
4
5  void factorial(int n);
6
7  int mul[1000]; /* 1000 个元素, 每个最大为100, 能表达的数超过 1e99,足够了 */
8
9  int main()
10 {
11 int i;
12
13 mul[0] = 1;
14 factorial(100);
15
16 for(i=999; mul[i] == 0 && i>=0; i--);
17
18 printf("%d e %d\n", mul[i], i*2);
19
20 for( ; i>=0; i--)
21 printf("%d", mul[i]);
22 }
23
24  void factorial(int n)
25 {
26 static int k;
27 int i;
28
29 if(n == 1) return;
30 else
31 {
32 for(k=999; mul[k] == 0 && k>=0; k--);
33
34 for(i=0; i<=k; i++)
35 mul[i] *= n;
36
37 for(i=0; i<=k; i++)
38 {
39 if(mul[i] >= UNIT)
40 {
41 mul[i+1] += mul[i] / UNIT;
42 mul[i] %= UNIT;
43 }
44 }
45 factorial(n-1);
46 }
47 }

 上面的代码有个对0的打印问题(详见1楼),已进行修正:

 

1 #include <stdio.h>
2
3  #define UNIT 1000
4  #define MUL 100000
5
6  void factorial(long int n);
7
8 int mul[MUL]; /* 每个元素规模为 UNIT,共 MUL 个,总共能储存 UNIT ^ MUL 规模数据 */
9
10 int main()
11 {
12 FILE *fp = fopen("result.txt", "w");
13 long int i, j;
14
15 mul[0] = 1;
16 factorial(10000);
17
18 for(i=MUL-1; mul[i] == 0 && i>=0; i--);
19
20 fprintf(fp, "%d e %ld\n", mul[i], i* 3);
21
22 for( ; i>=0; i--)
23 {
24 if(mul[i] == 0)
25 {
26 for(j=UNIT; j/10 > 0; j/=10) fprintf(fp, "%d", 0);
27 /* 这里根据一楼回帖提示,修正了对 0 元素的打印问题 */
28 }
29 else fprintf(fp, "%d", mul[i]);
30 }
31 getchar();
32 fclose(fp);
33 exit(0);
34 }
35
36 void factorial(long int n)
37 {
38 static long int k;
39 long int i;
40
41 if(n == 1) return;
42 else
43 {
44 for(k=MUL-1; mul[k] == 0 && k>=0; k--);
45
46 for(i=0; i<=k; i++)
47 mul[i] *= n;
48
49 for(i=0; i<=k; i++)
50 {
51 if(mul[i] >= UNIT)
52 {
53 mul[i+1] += mul[i] / UNIT;
54 mul[i] %= UNIT;
55 }
56 }
57 factorial(n-1);
58 }
59 }

 

 

 

 

 

 

 

 

posted @ 2010-04-05 23:48  长江西岸  阅读(1082)  评论(2编辑  收藏  举报