N!

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
[转]

107924372*15=1618865580。

     ①上面的乘法如果运用10进制,很简单。

     ②万进制呢?

           首先存数:a[0]=4372,a[1]=792,a[2]=1。107924372,从低位到高位每四位存到一个数组元素中。此时,总位数为3。

           接着运算:a[0]*15=65580,所以进位为a[0]/10000=6,a[0]=a[0]%10000=5580。a[1]*15=11880,a[1]=a[1]+6=11886。

                             进位为1,a[1]=1886。a[2]*15=15,a[2]=a[2]+1=16,进位为0。

           输出:a[2],a[1],a[0]即为1618865580。要注意的是:如果a[2]=886,那么该如何输出?直接输出:168865580。显然不对,

                      正确的是16088655880。输出的原则是:最高位原样输出,其它位如果小于1000,则高位补0,一位一补。

作者:lulipeng_cpp
来源:CSDN
原文:https://blog.csdn.net/lulipeng_cpp/article/details/7437641
版权声明:本文为博主原创文章,转载请附上博文链接!
下面是我根据上面博主的代码自己写的简洁一些的代码(全程没用long long):

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void factorial(int n)
{
    int a[10005];
    int place=0,carry,i,j;
    a[0]=1;
    for (i=1;i<=n;i++)
    {
        carry=0;
        for (j=0;j<=place;j++)
        {
            a[j]=a[j]*i+carry;
            carry=a[j]/10000;
            a[j]%=10000;
        }
        if (carry>0)
            a[++place]=carry;
    }
    cout<<a[place];
    for (i=place-1;i>=0;i--)
        cout<<setw(4)<<setfill('0')<<a[i];
    cout<<endl;

}
int main()
{
   int n;
   while(cin>>n)
       factorial(n);
    return 0;
}