求大整数的阶乘

/* 采用大整数乘法计算阶乘 */ /* 其实我一直想用计算机组成原理中的方法计算乘除会比较好 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 0x00001000 int* Long_Nxt(int k, int* res) { int* resbkp,i,j,kk,m,n = 0,r,carry=0; m = res[0]; kk=k;while(kk) {++n;kk/=10;} resbkp = (int*) calloc(MAXN,sizeof(int)); memset(resbkp,0,MAXN); for(i=0; i<=m; ++i) {resbkp[i]=res[i];} for (i=1; i < k; ++i) // *2 是自加一次 { for (j=1; j <= m; ++j) { r = res[j]+resbkp[j]+carry; res[j]=r%10;carry=r/10; } if(carry != 0) { res[++m]=carry; res[0] = m; carry = 0; // 进位之后carry应清0 } } free(resbkp); return res; } int* Long_Fac(int n, int* res) { int i = 2; if (!res) res = (int*)calloc(MAXN,sizeof(int)); // 这里到底申请几个空间比较好? res[0] = 1;res[1] = 1; // 初始值设为1 for (; i <= n; ++i) res = Long_Nxt(i, res); return res; } void Write(int* res) { int i = res[0]; for (;i >= 1;--i) printf("%d",res[i]); printf("/n"); } main() { int n = 0; int* res = NULL; scanf("%d",&n); res = Long_Fac(n,res); Write(res); free(res); } 

你可能感兴趣的:(求大整数的阶乘)