#include <stdio.h>
#include <string.h>
int main()
{
int a[26000];
int i, j, k, t, n;
while (scanf("%d", &n) != EOF)
{
memset(a, 0, sizeof(a)); //数组a[]所有元素置为0;
a[0] = 1; //a[0]一定要置为1哦,乘法运算。
t = 0; //t代表需要存储结果的数组元素的个数,也就是位数。
for(i=1; i<=n; i++) //i为 N! = 1*2*3*i...*n;
{
for(j=0; j<=t; j++)
a[j] *= i;
for(k=0; k<=t; k++)
{
if(a[k] >= 1000) //当元素大于1000就进位。
{
a[k+1] += a[k]/1000; //当进位时一定不要忘了把原来的值加上。
a[k] %= 1000;
if(k==t)
t++; //重点:这个if是在外层if成立的条件下执行的,即为当首个数组元素即为a[t]大于1000时就需要再多个a[t+1]来存a[t]的进位了。
}
}
}
printf("%d", a[t]); //输出时要从后向前输出。先输出前3位。
for(i=t-1; i>=0; i--)
printf("%03d", a[i]); //不能忘了%03d 因为直接输出时会把 数组元素前的0去掉。但因为它不是答案的第一个数,比如1001,直接输出是11。
printf("\n");
}
return 0;
}
/******************* *
作者:桂思
时间:2013年12月7日
用途:计算 N!(0<= N <=10000)
提交:HDU AC
******************* */
浙公网安备 33010602011771号