算法基本原理
用我们小学时用的计算两个数相乘列竖式再计算和的方法,用计算机模拟出相似的思路,用数组存储每一次的计算结果,并处理一些特殊情况,就可以了。
具体方法可参考我的其他文章:
代码
#include<stdio.h>
#define N 500010
int a[N],b[5],c[N],d[N];
int len(int *w) { //求数组有效长度的函数
int x=0,i;
for(i=0;i<N;i++) if(w[i]!=-1) x++;
return x;
}
int main() {
int i,j,k,v,u,al,bl=5,jc,jj,m,n,s=0;
for(v=0;v<N;v++) a[v]=-1;//初始化数组
a[0]=1;
for(v=0;v<4;v++) b[v]=0;
b[4]=1;
printf("请输入正整数:");
scanf("%d",&n);
for(v=1;v<=n;v++) {
al=len(a);
for(i=0;i<al+bl;i++) c[i]=d[i]=0;//初始化中间数组
for(i=bl-1;i>=0;i--){
k=al;
jc=0;
//核心部分
for(j=al-1;j>=0;j--) {
c[k]=(a[j]*b[i]+jc)%10; //求得余数
jc=(a[j]*b[i]+jc)/10; //进位
if(j==0) c[k-1]=jc;
k--;
}
for(j=al+i,m=al;j>=i;j--,m--) {
if(d[j]+c[m]>=10) d[j-1]++; //进位
d[j]=(d[j]+c[m])%10; //累加
}
//核心部分
}
for(i=0;i<al+bl;i++) a[i]=d[i]; //值传递给a数组
b[4]++;
for(i=4;i>0;i--) { //乘数加一
if(b[i]==10) {
b[i]=0;
b[i-1]++;
}
}
}
printf("其阶乘为:");
for(u=0;u<len(a)+5;u++) { //答案开头有0则跳过
if((a[u]==0&&s==0)||a[u]==-1) continue;
s=1;
printf("%d",a[u]);
}
}
运行结果示例