Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1 2 3
Sample Output
1 2 6
Author
JGShining(极光炫影)
这道题的思想与我的上一篇大数相加的思想基本相同。例如;120*6,用小学乘法式子为
1 2 0 |
x 6 |
7 2 0 |
求n得阶乘只需计算(n-1)!*n,而求(n-1)!*n 显然很简单 利用上面乘式的方法,该进位的进位该取余的取余,这里无非有难度的是如何存这个乘积小一点的数的阶乘我们肯定会求,用for循环就可以直接输出,但是数太大就会超限,怎么解决这个问题呢,这里就得把你所得的数用数组存起来了。我们在计算乘积的时候显然是一位一位的计算的,那么我们利用这一点,每一位计算后便存起来不就行了吗?接下来看代码。
#include<stdio.h>
int main()
{ int i,j,l,a[40000]={0},p,c,n;//利用数组来存储阶乘的每一位
while(scanf("%d",&n)!=EOF)
{a[0]=1;//给数组第一位赋值为1;
p=0;//p代表进的位数
l=1;//前一次阶乘的位数。比如1的阶乘的前一次的阶乘位数为1。6的阶乘的前一次阶乘的位数为3。
for(i=1;i<=n;i++)//依次求乘积直到n。
{
for(j=0;j<l;j++)//计算(i-1)!*i
{
c=a[j]*i+p;//p代表进位,
a[j]=c%10;
p=c/10;//求出p,需要进几位。
}//执行完每一位的乘法运算后,p有可能仍不是零所以进行下面操作
while(p!=0)
{
a[l++]=p%10;//对p进行取余,同时增加数组l的长度。
p=p/10;//此while循环与求一个n位数上的每一位上的数字方法一样,
}
}
for(i=l-1;i>=0;i--)//对数组逆序输出
{
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}