天天看點

大數階乘問題(數組元素存取多位數)

#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);

}

繼續閱讀