HDU 1042 N! 题意:给定整数N(0 ≤ N ≤ 10000), 求 N! (题目链接)
#include <iostream>
using namespace std;
//每个数组元素存放5位数
const int MAX=100000; //%MAX后结果为[0,99999]
const int N=10001; //7132+1
int a[N]={0};
void prtBig(int n)
{
for(int i=0; i<n;i++)
{
if(i==0) //最高位忽略前导0
printf("%d",a[i]);
else //非最高位按5位输出
printf("%05d",a[i]);
}
printf("\n");
}
//下面的n为引用参数,即n为实参m的别名
//如此对形参的改变即是对实参的改变
void mul(int &n, int k)
{
int c=0;
//从最低位开始乘
for (int i=n-1; i>=0; i--)
{
int t=a[i]*k+c;
a[i]=t%MAX;
c=t/MAX;
}
if (c>0)//最后的进位放在最前面
{
for(int j=n;j>0;j--) a[j]=a[j-1];//移位
a[0]=c; //进位放在最高位
n++; //n变化则实参也变
}
}
bool run()
{
int n;
if(scanf("%d",&n)==EOF) return false;
fill(a,a+N,0); //所有数组元素清0
a[0]=a[1]=1; //0,1的阶乘为1
int m=1; //数组实际长度为1
for(int i=2;i<=n;i++) //从2开始乘
{
mul(m, i);
}
prtBig(m);
return true;
}
int main()
{
while(run());
return 0;
}