阶乘

来源:互联网 发布:查看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;
}