自己写的复杂点的大数阶乘(会超时,有助于理解大数相乘)
#include<stdio.h> #include<string.h> #define MAX(x,y) x>y?x:y char z[100010]; int j; void bigmultiply(int n){int x[100010],y[100010]; memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); int t=j,i,temp=0,max=0; for(i=t-1,j=0;i>=0;--i,j++)x[j]=z[i]-'0'; for(i=0;i<t;++i){j=i; temp=x[i]*n; while(temp){ y[j]+=temp%10; if(y[j]>9)y[j+1]+=y[j]/10,y[j]%=10; j++; temp/=10; } while(y[j])j++; max=MAX(max,j); } for(i=max-1,j=0;i>=0;--i,j++)z[j]=y[i]+'0'; z[j]='\0'; } int main(){ int m,t; while(~scanf("%d",&m)){memset(z,0,sizeof(z));z[0]='1';j=1; //bigmultiply(m); for(int i=1;i<=m;++i)bigmultiply(i); printf("%s\n",z); } return 0; }
借助模板写的:
1 #include<stdio.h> 2 #include<string.h> 3 #define MAXN 100010 4 #define MAX(x,y) x>y?x:y 5 int m[MAXN]; 6 void fac(int n){int i,j,temp1,temp2,t=0; 7 m[0]=1; 8 for(i=2;i<=n;++i){temp2=0; 9 for(j=0;j<=t||temp1;++j){ 10 temp1=m[j]*i+temp2; 11 m[j]=temp1%10; 12 temp2=temp1/10; 13 t=MAX(t,j); 14 } 15 } 16 for(j=MAXN-1;j>=0;j--)if(m[j])break; 17 for(i=j;i>=0;i--)printf("%d",m[i]); 18 puts(""); 19 } 20 int main(){ 21 int N; 22 while(~scanf("%d",&N)){memset(m,0,sizeof(m)); 23 fac(N); 24 } 25 return 0; 26 }