天天看点

大数阶乘问题(数组元素存取多位数)

#include <stdio.h>

#include <memory.h>

#include <string.h>

#define N ((int)1e6+5)

#define M ((int)1e7)  //每个元素存M位 

#define M0 7

long long a[N];

int getW(int n);

int main()

{

    int n;

    while(scanf("%d",&n)==1){

//     int a[N]={1}; 

    memset(a,0,sizeof(a));

        //从低位到高位存储大数 

        a[0]=1;

        int k=1;    //当前k位数 

        //计算阶乘 

        for(int i=2;i<=n;i++){

            //当前大数a乘以i 

            int jin=0;  

            for(int j=0;j<k;j++){

                //当前位乘积+进位 

                a[j]=a[j]*i+jin;

                jin=a[j]/M;    //进位

                a[j]=a[j]%M;   //当前位 

            }

            //处理最高位进位 

            while(jin){

                a[k++]=jin%M;  //当前位 

                jin/=M;        //进位 

            } 

        }

        //输出从高位到低位

        printf("%d",a[k-1]);

        //解决前导0问题 

        for(int i=k-2;i>=0;i--){

          int tl=getW(a[i]);

        for(int j=tl;j<M0;j++)

            printf("0");

            printf("%d",a[i]);

    }

        printf("\n");

    //    printf("%d\n",k);

printf("weishu:%d\n",(k-1)*M0+getW(a[k-1]));

    }

    return 0; 

}

int getW(int n) 

{

    char ts[M0+2];

    sprintf(ts,"%d",n);

    return strlen(ts);

}

继续阅读