首页 > 技术文章 > N!大整数阶乘问题

luckygxf 2014-04-13 21:33 原文

问题:求N!阶乘,1<=N<10000

思路:windows下面visual 6.0中c一个整型占4个字节(自己可以try一下,printf("%d", sizeof(int))。N过大会使得结果溢出。

  这里我采用的是一个整型数组来存储结果int array_result[40000]数组每个元素表示结果的每一位

  

  计算过程

  1.遍历从1-N的每一个数i

  2.用i乘以array_result中的每一位j得到结果temp

  3.对temp对10取余数temp % 10放到array_retult[j]中,对carry = temp / 10作为进位放到前一位。

  4.最后输出结果

 

代码如下

 1 /*
 2  *
 3  *求N!的值 0<N<10000大整数的阶乘问题
 4  *思路:用4w的数组表示结果的每一位数,
 5  *每一次阶乘,数组的每一位乘以i 求余数放到该位 , 剩下的放到作为进位放到下一位(这里进位可能不是1位数,可能是多位数)
 6  */
 7 #include <stdio.h>
 8 #include <stdlib.h>
 9 #include <string.h>
10 
11 #define SIZE 40000                                                //存放结果集的数组大小
12 
13 int main()
14 {
15     int num;                                                    //N
16     int array_result[SIZE];
17     int i = 0;
18     int j = 0;
19     
20     while(scanf("%d", &num) != EOF)                                //接收用户输入
21     {
22         memset(array_result, 0, sizeof(array_result));            //初始化结果数组
23         array_result[0] = 1;
24 
25         i = 2;
26         for(; i <= num; i ++)                                    //处理每一次输入的num
27         {
28             int carry = 0;
29             j = 0;
30             
31             for(; j < SIZE; j ++)
32             {
33                 int temp = array_result[j] * i + carry;            //每一位 乘以 i
34                 array_result[j] = temp % 10;
35                 carry = temp / 10;                
36             }
37         }
38         for(i = SIZE - 1; i >= 0; i --)                            //找到结果的最高位
39         {
40             if(array_result[i])
41             {
42                 break;
43             }
44         }
45         j = 0;
46         
47         for(j = i; j >= 0; j --)                                //输出结果
48         {
49             printf("%d", array_result[j]);
50         }
51         printf("\n");                                            //输出换行符
52         
53   }
54 }

 

  

推荐阅读