算法基本原理
用我们小学时用的计算两个数相乘列竖式再计算和的方法,用计算机模拟出相似的思路,用数组存储每一次的计算结果,并处理一些特殊情况,就可以了。
具体方法可参考我的其他文章:
代码
#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]); } }
运行结果示例