给定整数 N (0 ≤ N ≤ 10000),你的任务是计算 N! 。
输入
每行一个整数 N,处理到文件结束为止。
输出
对于每个 N,输出一行,包含 N! 的计算结果。
示例输入
0
1
2
3
示例输出
1
1
2
6
显然10000的阶乘是一个超大的数
这里记录一种储存大数的办法,压位法
其实就是把十进制改成所要的进制,比如压4位,就变成了1e4次方进制了,其他按正常的乘法计算就行了,如123451234,那12345就可以变成110000+23451,1234=12341,然后12342345=n,11234=m,那新成的数就等于(m+n/10000)*10000+n%10000了,就跟十进制的做法是一样的
输出的时候除了最高位还需要在每一个数前补零补满四位(压几位补到几位)
这道题我直接压9位了,省了很多倍时间
ac代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// 1010101 > sqrt(1e12)
const int N=1e9;
long long int p[10000];
void asd(int x)
{
memset(p,0,sizeof(p));
p[0]=1;
int k=0,j;
for(int i=1;i<=x;i++)
{
p[0]=p[0]*i;
for(j=0;j<=k;j++)
{
p[j+1]=p[j+1]*i+p[j]/N;
p[j]=p[j]%N;
}
if(p[k+1]>0){
k++;
}
}
printf("%lld",p[k]);
for(int i=k-1;i>=0;i--)
printf("%09d",p[i]);
printf("\n");
}
int main()
{
int a;
while(~scanf("%d",&a))
{
asd(a) ;
}
}在这里插入代码片