问题描述:
比如:
求:1*2*3*4*5*.................*999*1000的结果!
这个我知道,关键问题在于如何动态确定需要多大空间的数组,一种可能的选择是用链表动态确定,但是这对于实际应用时是不可取的,因为用链表比用数组要慢。所以我个人认为,应当对此问题进行研究,得出一个存储N!所需空间的映射表,在程序执行时直接选择所需要的空间!从执行效率和节省空间考虑!
至于效率可以用如下例程实现:
/*应当注意变量b和m的使用技巧*/
/* 求n! (0<n<10000)*/ #include<stdio.h> #include<conio.h> #include<malloc.h> void cal(unsigned int *s,int n) { unsigned long p,k=0; int i;
/* b用来记录后面的0 ,m用于跟踪应当处理的末尾位置*/ static int m=1,b=0;
for(i=b;i<m;i++) { p=(long)s[i]*(long)n+k; k=p/10000; s[i]=p-k*10000; }
if(!s[b]) { b++; }
if(k){ s[m++]=k; } }
int main(void) { unsigned int *s; int i; int n; scanf("%d",&n); s=(unsigned int *)malloc(n*sizeof(s));
for(i=1;i<n;i++) { s[i]=0; } s[0]=1;
for(i=2;i<=n;i++) { cal(s,i); }
printf("\n%d!=\n",n);
n--; while(!s[n]) { n--; } printf("%d",s[n--]);
for(i=n;i>=0;i--) { printf("%04d",s[i]); } printf("\n"); free(s); getch(); return 0;
}
/*为了便于大家看清楚,重新修改风格*/ /*应当注意变量b和m的使用技巧*/ /* 求n! (0<n<10000)*/ #include<stdio.h> #include<conio.h> #include<malloc.h> void cal(unsigned int *s,int n) { unsigned long p,k=0; int i;
/* b用来记录后面的0 ,m用于跟踪应当处理的末尾位置*/ static int m=1,b=0;
for(i=b;i<m;i++) { p=(long)s[i]*(long)n+k; k=p/10000; s[i]=p-k*10000; }
if(!s[b]) { b++; }
if(k){ s[m++]=k; } }
int main(void) { unsigned int *s; int i; int n; scanf("%d",&n); s=(unsigned int *)malloc(n*sizeof(s));
for(i=1;i<n;i++) { s[i]=0; } s[0]=1;
for(i=2;i<=n;i++) { cal(s,i); }
printf("\n%d!=\n",n);
n--; while(!s[n]) { n--; } printf("%d",s[n--]);
for(i=n;i>=0;i--) { printf("%04d",s[i]); } printf("\n"); free(s); getch(); return 0;
}