問題:求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 }