#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
#define MAXN 100000
int jcw(int m); //计算n阶乘的总位数
int jc(int n); //计算n阶乘
int main(){
int n;
while(scanf("%d",&n)!=EOF){
jcw(n);
jc(n);
}
return 0;
}
int jcw(int m){ //阶乘位数
long i;
double sum;
sum=1.0;
for(i=1;i<=m;i++){
sum+=log10(i);
}
printf("%ld\n",(long)sum);
}
/*
int jc(int n){ //动态开辟阶乘所需位数空间 ,数值太大时,申请不到空间,有问题
int *s,a;
long sum;
sum=jcw(n)+1;
(s=(int *)malloc(sizeof(int)*sum));
if(!s){
printf("ddddd\n");
return 0;
}
int i,j,c,flage=0;
memset(s,0,sizeof(int)*sum);
s[0]=1;
for(i=2;i<=n;i++){
c=0;
for(j=0;j<=flage;j++){
a=s[j]*i+c;
c=a/10;
s[j]=a%10;
}
while(c!=0){
flage++;
s[flage]=c%10;
c=c/10;
}
}
while(flage>=0){
printf("%d",s[flage--]);
}
printf("\n");
free(s);
s=NULL;
return 0;
}
*/
int jc(int n){ //计算n阶乘
int s[MAXN],a;
int i,j,c,flage=0;
memset(s,0,sizeof(MAXN));
s[0]=1;
for(i=2;i<=n;i++){
c=0;
for(j=0;j<=flage;j++){
a=s[j]*i+c;
c=a/10;
s[j]=a%10;
}
while(c!=0){
flage++;
s[flage]=c%10;
c=c/10;
}
}
while(flage>=0){
printf("%d",s[flage--]);
}
printf("\n");
return 0;
}
阶乘
最新推荐文章于 2014-08-07 14:02:01 发布