hdu 1042 N!

原题:hdoj 1042

原题大意

题意很简单就是求阶乘.但数据要求能求到10000.

算法分析

这题因为数据大,所以用数组保存,用大数相乘的思想.每个数组元素的值在0~9999间,过了就进一位,每个数组元素应当有4位(除了开头部分),不够用0补.

注意:

我一开始是从n往1乘,结果超时了,只有用1往n乘才能通过.同时0!=1不能忽略.

代码程序

#include <iostream>
using namespace std;
#define N 10000
int main(){
    int a[N],n,m,len;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) //0!=1
        {printf("1\n");continue;}
        len=1;
        a[0]=n;m=0;
        for(int t=1;t<n;t++)
        {
            for(int i=0;i<len;i++)
            {
                int k=(a[i]*t)+m;
                a[i]=k%N;
                m=k/N;
            }
            if(m)
            {
                len++;
                a[len-1]=m;
            }
            m=0;
        }
        printf("%d",a[len-1]);
        for(int i=len-2;i>=0;i--)
        {
            printf("%04d",a[i]);//输出4个数字,不够用0补
        }
        printf("\n");
    }

    return 0;
}