问题:求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.最后输出结果
代码如下
/*
*
*求N!的值 0<N<10000大整数的阶乘问题
*思路:用4w的数组表示结果的每一位数,
*每一次阶乘,数组的每一位乘以i 求余数放到该位 , 剩下的放到作为进位放到下一位(这里进位可能不是1位数,可能是多位数)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define SIZE 40000 //存放结果集的数组大小 int main()
{
int num; //N
int array_result[SIZE];
int i = ;
int j = ; while(scanf("%d", &num) != EOF) //接收用户输入
{
memset(array_result, , sizeof(array_result)); //初始化结果数组
array_result[] = ; i = ;
for(; i <= num; i ++) //处理每一次输入的num
{
int carry = ;
j = ; for(; j < SIZE; j ++)
{
int temp = array_result[j] * i + carry; //每一位 乘以 i
array_result[j] = temp % ;
carry = temp / ;
}
}
for(i = SIZE - ; i >= ; i --) //找到结果的最高位
{
if(array_result[i])
{
break;
}
}
j = ; for(j = i; j >= ; j --) //输出结果
{
printf("%d", array_result[j]);
}
printf("\n"); //输出换行符 }
}