常用演算法設計方法(三) — 遞推法

來源:互聯網
上載者:User
 遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。設要求問題規模為N的解,當N=1時,解或為已知,或能非常方便地得到解。能採用遞推法構造演算法的問題有重要的遞推性質,即當得到問題規模為i-1的解後,由問題的遞推性質,能從已求得的規模為1,2,…,i-1的一系列解,構造出問題規模為I的解。這樣,程式可從i=0或i=1出發,重複地,由已知至i-1規模的解,通過遞推,獲得規模為i的解,直至得到規模為N的解。
【問題】   階乘計算
問題描述:編寫程式,對給定的n(n≦100),計算並輸出k的階乘k!(k=1,2,…,n)的全部有效數字。
由於要求的整數可能大大超出一般整數的位元,程式用一維數組儲存長整數,儲存長整數數組的每個元素只儲存長整數的一位元字。如有m位成整數N用數組a[ ]儲存:
   N=a[m]×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位元,接著是低位到高位依次是0、2、1,表示成整數120。
   計算階乘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 =a;
   for ( j=1;j<=k;j++)
   {   for ( carry=0,i=1;i<=m;i++)
      {   r=(i<a[0]?a+b:a)+carry;
         a=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 (i=a[0];i>0;i--)
      printf(“%d”,a);
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();
   }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.