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