原题: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;
}