/*************************************************/
/* 计算N的阶乘 */
/* 皮业勇 */
/* 2005.9.19 */
/* piyeyong@gmail.com */
/*************************************************/
#include<stdio.h>
#define N 20000
#define MAX 20000
/* 存放结果的数组,低位在前,高位在后 */
int integer[N+1];
/* 把num加到integer的第p位上,注意,满位时要进位,所以add会调用本身 */
void add(int p, int num)
{
int q, num2;
if(p < 1 || p > N) {
printf("add error/n");
return;
}
do{
integer[p++] += num % 10;
q = p - 1;
if(integer[q] > 9) {
num2 = integer[q];
integer[q] = num2 % 10;
add(q + 1, num2/10);
}
num /= 10;
}while(num);
}
/* integer 乘以c */
void multiply(int c)
{
int i;
int iTemp = 0;
for(i = N; i >=1; i --)
{
if(!integer[i])
continue;
iTemp = integer[i] * c;
integer[i] = 0;
add(i, iTemp);
}
}
int main()
{
int n, p;
printf("Input number n:");
scanf("%d", &n);
if(n > N) {
printf("Exceed max number %d/n", N);
return 1;
}
if(n < 0) {
printf("Please input a positive number/n");
return 2;
}
integer[1] = 1;
for(int i=1; i <=n; i ++)
{
multiply(i);
}
printf("Result of %d! is:", n);
for(i = N; i >=1; i --)
{
if(integer[i]) {
p = i;
break;
}
}
for(i = p; i >=1; i --) {
printf("%d", integer[i]);
}
putchar('/n');
/* 验证结果用,数结尾0的个数时参照 */
printf("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/n");
return 0;
}