问题:求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(" "); //输出换行符 52 53 } 54 }