程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 遞推法之大整數的階乘

遞推法之大整數的階乘

編輯:關於C語言
 

最近看書時遇到這樣的問題,寫點東西,幫助自己記憶。

【例1】編寫程序,對給定的n(n<100),計算並輸出k的階乘k!(k=1,2,3...,n)的全部有效數字。

要求的數組可能大大超出一般整數的位數,這時此題考慮的終點。

所以我們用一個數組a來存儲長整數。

存儲方法如下圖所示:

遞推法之大整數的階乘 - 小二ン上茶 - Ice river Age ★ 冰河時代

a[0],此整數的長度。

a[1],個位

a[2],十位

a[3],百位

...............

算法:計算階乘K!可采用對已求得的階乘(k-1)!連續累加K-1次後求出。例如,已知4!=24,計算5!,可對原來的24再累加4次24後得到120。詳細程序如下:

#include<stdio.h>

#include<malloc.h>

#define MAXN 1000

void pnext(int a[],int k){

    int *b,m = a[0],i,j,r,carry;

    b = (int *)malloc(sizeof(int)*(m+1));

    for(i = 1;i<=m;i++) b[i] = a[i];

    for(j = 1;j<k;j++){    //控制累加K-1次

            for(carry = 0,i = 1;i<=m;i++){

                r=(i<=a[0]?a[i] + b[i]:a[i]) + carry;

                a[i] = r%10;carry = r/10;

            }

            if(carry) a[++m] = carry;

    }

    free(b);

    a[0] = m;

}

 

void write (int *a ,int k){

    int i;

    printf("%4d!=",k);

    for(int i=a[0];i>0;i--)    printf("%d",a[i]);

    printf("\n\n");

}

 

void main(){

    int a[MAXN],n,k;

    printf("Enter the number n:");

    scanf("%d",&n);

    a[0]=1;a[1]=1;write(a,1);

    for(k=2;k<=n;k++){

        pnext(a,k);

        write(a,k);

        getchar();

    }

}

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved