遞推法

遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。設要求問題規模爲N的解,當N=1時,解或爲已知,或能非常方便地得到解。能採用遞推法構造算法的問題有重要的遞推性質,即當得到問題規模爲i-1的解後,由問題的遞推性質,能從已求得的規模爲12,…,i-1的一系列解,構造出問題規模爲I的解。這樣,程序可從i=0i=1出發,重複地,由已知至i-1規模的解,通過遞推,獲得規模爲i的解,直至得到規模爲N的解。

【問題】       階乘計算

問題描述:編寫程序,對給定的nn100),計算並輸出k的階乘k!(k=12,…,n)的全部有效數字。

由於要求的整數可能大大超出一般整數的位數,程序用一維數組存儲長整數,存儲長整數數組的每個元素只存儲長整數的一位數字。如有m位成整數N用數組a[ ]存儲:

       N=a[m]×<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />10m-1+a[m-1]×10m-2+ +a[2]×101+a[1]×100

並用a[0]存儲長整數N的位數m,即a[0]=m。按上述約定,數組的每個元素存儲k的階乘k!的一位數字,並從低位到高位依次存於數組的第二個元素、第三個元素……。例如,5=120,在數組中的存儲形式爲:

3

0

2

1

……

首元素3表示長整數是一個3位數,接着是低位到高位依次是021,表示成整數120

       計算階乘k!可採用對已求得的階乘(k-1)!連續累加k-1次後求得。例如,已知4=24,計算5!,可對原來的24累加424後得到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++)

       {     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;

}

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

void  write(int *a,int k)

{     int i;

       printf(“%4d=”,k);

       for (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();

       }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章