HDU1042 N!

N!

题意很明白,就是求n!
这道题的数据范围表示结果肯定是一个大数。那么我们就要想到用数组来存储数据。
我使用万进制来做这道题的,就是说逢万进一。开一个数组a[], 每一个a[i]表示一个一万以内的数,做法就是模拟乘法的运算规则,对于每个乘数,从右乘到左,乘完以后从右到左判断是否进位,如果最高位进位了,就将数的长度更新。
要注意一点的是如果a[i]不是最高位,并且a[i]不是四位数,那要在前面补零直到是个四位数,如a[i] = 90,那么要补成0090,这个操作在输出时直接输出0就行了,不用刻意地去补。
代码如下:

#include
using namespace std;
int bits[40050];
int single(int n)//获得四位数的位数
{
    if(n == 0)return 1;
    int res = 0;
    while(n)
    {
        n /= 10;
        res++;
    }
    return res;
}
int main()
{
    int n,maxlen;
    while(~scanf("%d", &n))
    {
        memset(bits, 0, sizeof(bits));
        bits[1] = 1;
        maxlen = 1;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= maxlen; j++)
            {
                bits[j] *= i;
            }
            for(int j = 1; j <= maxlen; j++)
            {
                    if(bits[j] >= 10000)
                    {
                        bits[j+1] += bits[j] / 10000;
                        bits[j] = bits[j] % 10000;
                        maxlen = max(maxlen, j+1);
                    }
            }
        }
        for(int i = maxlen; i >= 1 ; i--)
        {
            if(bits[i]<10000 && i != maxlen)//对于不足四位的补0
            {
                for(int j = 1; j <= 4-single(bits[i]); j++)
                    printf("0");
            }
            printf("%d",bits[i]);
        }
        printf("\n");
    }
}

你可能感兴趣的:(大数,大数)