题目描述
输入一个正整数N,输出N的阶乘。
输入描述:
正整数N(0<=N<=1000)
输出描述:
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
示例1
输入
4 5 15
输出
24 120 1307674368000
参考:刘汝佳《算法竞赛入门经典》:
大体思路如下:
将上次阶乘的结果保存至数组a中,本次再乘以new_i,再保存至数组a中供下次使用。保存时低位在前,高位在后,这样可以模拟小学生竖式乘法。
输出最终结果倒过来输出,注意剔除前导0。
#include <stdio.h>
#include <string.h>
const int MAXN = 36000;
int a[MAXN];
int main()
{
int n, i, j;
while(~scanf("%d", &n))
{
memset(a, 0, sizeof(a));
a[0] = 1;
for(i = 2; i <= n; i++)
{
int c = 0;
for(j = 0; j < MAXN; j++) //(i-1)! * i
{
int s = a[j] * i + c;
a[j] = s % 10;
c = s / 10; //进位
}
}
for(j = MAXN - 1; j >= 0; j--)
if(a[j])
break;
for(i = j; i >= 0; i--)
printf("%d", a[i]);
printf("\n");
}
return 0;
}