总时间限制:
5000ms
内存限制:
655360kB
描述
求10000以内n的阶乘。
输入
只有一行输入,整数n(0<=n<=10000)。
输出
一行,即n!的值。
样例输入
100样例输出
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000来源
JP06
#include<stdio.h>
#include<string.h>
int main()
{
int temp=1,a[100000]; //还是大数的计算,依然采用数组存储加进位的方法
memset(a,0,sizeof(a)); // temp用来存储当前位数
a[1]=1;
int n;
scanf("%d",&n);
int i,j=1;
for(i=2;i<=n;i++) //外层循环是对阶乘的便利,要乘n-1下(除去第一个1)
{
for(j=1;j<=temp;j++) //内存的这个循环是对每一位进行乘
{
a[j]*=i;
}
for(j=1;j<=temp;j++) //对每一位进行进位操作,这里比起上一个加法有了改进,不需判断
{
a[j+1]+=a[j]/10;
a[j]%=10;
}
if(a[j]>0) //对最高位的下一位判断,看最高位有没有进到下一位
{
while(a[j]>=10) //如果进到了,且这里还要再进一步,那么继续执行进位,j++
{
a[j+1]+=a[j]/10;
a[j]%=10;
j++;
}
temp=j; //temp存储位数
} //注意这里temp不能放在if a[j]>0外面,因为j是最高位+1,最后会多出位数,补0
}
for(i=temp;i>=1;i--) //便利输出
{
printf("%d",a[i]);
}
return 0;
}