阶乘
来源:互联网 发布:查看ubuntu所有jdk 编辑:程序博客网 时间:2024/04/28 22:53
//模板
//阶乘
/*************************************
求n的阶乘关键之处就是寻找高效率的算法
当n很大时,如果还用大整数乘法那一数组
的每一位只存放一位数的话,那样将耗费很
多时间,为了缩短时间,可以将数组的每一
位存放五为十进制数,而每一个数组元素相
乘或相加的时间是基本不变的,所以这样就
可以将时间缩短到原来的1/10了。
**************************************/
#i nclude <stdio.h>
int main()
{
int n;
while(scanf("%d",&n) != EOF){
int s[16000]={0};
int i,j;
int c; //储存进位
int t;
s[0]=1;
t=0;
c=0;
for(i=1;i <= n;i++){ //循环相乘
for(j=0;j <= t;j++){
s[j]=s[j]*i+c;
c=0; //这一语句绝对要注意
if(s[j] > 99999){
c=s[j]/100000;
s[j]%=100000;
}
}
if(c != 0){t++;s[t]=c;}
c=0; //这一语句绝对要注意
}
printf("%d",s[t]);
for(i=t-1;i >= 0;i--){ //每一的数组元素都储存5位数
//不够的就在前面补零
//if(s[i] < 10)printf("0000");
//else if(s[i] < 100)printf("000");
//else if(s[i] < 1000)printf("00");
//else if(s[i] < 10000)printf("0");
printf("%05d",s[i]); //好强啊!
}
printf("/n");
}
return 0;
}