题目描述:
意思就是求N的阶乘,1≤N≤10000,用log估计一下,有30000+位,没有数据类型可以存储下了,肯定是用大数乘法了,写一个代码:
#include<stdio.h>
int a[10002][40000]={0};
int b[10002];//存储每个数的阶乘有几位
int main(){
int i;
a[0][0]=1;
a[1][0]=1;
a[2][0]=2;
b[0]=1;b[1]=1;b[2]=1;
for(i=3;i<=10000;i++){
int k=i,t=0,j,temp,n;
while(k!=0){
int c[40002]={0};
int flag=0;
for(j=0;j<b[i-1];j++){
temp=a[i-1][j]*(k%10)+flag;
c[j+t]=temp%10;
flag=temp/10;
}
if(flag){
c[j+t]=flag;j++;
flag=0;
}
for(n=0;n<j+t;n++){
temp=a[i][n]+c[n]+flag;
a[i][n]=temp%10;
flag=temp/10;
}
if(flag){
a[i][n]=flag;b[i]=n+1;
}
else b[i]=n;
t=t+1;k=k/10;
}
}
int T,q;
while(scanf("%d",&T)!=EOF){
for(q=b[T]-1;q>=0;q--)
printf("%d",a[T][q]);
printf("\n");
}
return 0;
}
把所有数的阶乘算出来存储,然而OJ系统告诉我Memory Limit Exceeded,超过内存限制了,只能换种思路了,直接上AC代码:
#include<stdio.h>
#include<memory.h>
#define MAX 10000
#define BASE 100000
int h[MAX];
int main(){
int i,j,k,carry;
int n;
while(scanf("%d",&n)!=EOF)
{
memset(h,0,MAX*sizeof(int));
for(i=1,h[MAX-1]=1;i<=n;++i)
for(k=MAX-1,carry=0;k>=0;--k){
carry+=i*h[k];
h[k]=carry%BASE;
carry/=BASE;
}
for(j=0;j<MAX && h[j]==0;++j);
printf("%d",h[j++]);
for(;j<MAX;++j)
printf("%05d",h[j]);
printf("\n");
}
return 0;
}