您的位置:首页 > 其它

自己写的复杂点的大数阶乘(会超时,有助于理解大数相乘)

2015-07-24 17:53 309 查看
#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;
}


借助模板写的:

#include<stdio.h>
#include<string.h>
#define MAXN 100010
#define MAX(x,y) x>y?x:y
int m[MAXN];
void fac(int n){int i,j,temp1,temp2,t=0;
m[0]=1;
for(i=2;i<=n;++i){temp2=0;
for(j=0;j<=t||temp1;++j){
temp1=m[j]*i+temp2;
m[j]=temp1%10;
temp2=temp1/10;
t=MAX(t,j);
}
}
for(j=MAXN-1;j>=0;j--)if(m[j])break;
for(i=j;i>=0;i--)printf("%d",m[i]);
puts("");
}
int main(){
int N;
while(~scanf("%d",&N)){memset(m,0,sizeof(m));
fac(N);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: