N!

N!

 

Time Limit:   5000MS       Memory Limit:   65535KB
Submissions:   96       Accepted:   26

 

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
解法一:
//用大整数想乘的方法
# include<iostream>
# include<cstring>
using namespace std;
int str[100000];
int main()
{
    int num,flag=0;
    int i,c,k=0,j;
    while(cin>>num)
    {
        memset(str,0,sizeof(str));
        k=0;
        flag=0;
    str[0]=1;
    for(c=1;c<=num;c++)
    {
        int m=k;
        k=0;
    for(k=0;k<m;k++)//先存每位的值
            str[k]*=c;
    for(j=0;j<k;j++)//进位
    {
        if(str[j]>9)str[j+1]+=str[j]/10;
            str[j]%=10;
    }
    while(str[k]!=0)//超出末位再进
    {
        if(str[k]>9)str[k+1]+=str[k]/10;
            str[k]%=10;
            k++;
    }
    }
    for(i=k;i>=0;i--)
    {
        if(flag==0)
        {
        if(str[i]!=0)//非零开始
        {
            cout<<str[i];
            flag=1;
        }
        }
        else
            cout<<str[i];
    }
    cout<<endl;
    }
    return 0;
}


解法二:

 

//网上说了一种“万进制”,太妙了!时间、空间都省了,我也写了写
# include<iostream>//应该用C更好些吧
# include<cstring>
# include<iomanip>
using namespace std;
int str[10000];
int solve(int n)
{
    int w=1,sign,i,j,leap;
    str[0]=1;
    
    for(i=1;i<=n;i++)
    {
        sign=0;
        for(j=0;j<w;j++)
        {
            leap=str[j];
            str[j]=(leap*i+sign)%10000;//用“万进制”的四位数
            sign=(leap*i+sign)/10000;//类似十进制进位
        }
        if(sign)
        {
         w++;
           str[j]=sign;
           sign=0;
        }
    }
    return w;
}
int main()
{
    int num,i,j;
while(cin>>num)
{
    memset(str,0,sizeof(str));
    j=solve(num);
    cout<<str[j-1];
    for(i=j-2;i>=0;i--)
        cout<<setw(4)<<setfill('0')<<str[i];//没满四位数就填0
        cout<<endl;
}
    return 0;
}

 

 

 

posted on 2012-05-22 18:57  即为将军  阅读(260)  评论(0)    收藏  举报

导航