c語言-楊輝三角的兩種輸出方法


c語言對楊輝三角的簡單實現

楊輝三角是數字與幾何的完美融合,楊輝三角有着非常神奇的排列規律。
下面我們來復習以下楊輝三角形的特性,並用程序來輸出楊輝三角形。

           1
         1   1
       1   2   1
     1   3   3   1
   1   4   6   4   1

如上,可以看出一個很簡單的規律:

  • 每個數等於它上方兩數之和。

  • 每行數字左右對稱,由1開始逐漸變大。

  • 第n行的數字有n項。

利用這三個規律,我們可以用數組來實現楊輝三角的排列。

    #include <stdio.h>
    #define N 14
    void main()
    {
        int i, j, k, n, arr[N][N];  /*定義二維數組arr[14][14]*/
        do
        {
            printf("請輸入要打印的行數:");
            scanf("%d",&n);
        }
        while(n<=0||n>=N-1);       //對打印行數進行判斷,避免越界
       
        for(i=1;i<=n;i++)
            a[i][1] = a[i][i] = 1;  //兩邊的數令它為1,因為現在循環從1開始,就認為a[i][1]為第一個數
        for(i=3;i<=n;i++)
            for(j=2;j<=i-1;j++)
                a[i][j]=a[i-1][j-1]+a[i-1][j];  //除兩邊的數外都等於上方兩數之和
        for(i=1;i<=n;i++){
            for(k=1;k<=n-i;k++)
                printf("   ");  //對打印進行排版
            for(j=1;j<=i;j++)
                printf("%6d",a[i][j]);
            
            printf("\n"); 
        }
        return 0;
    }

以上就是數組對楊輝三角的實現,如果不想使用數組還可以利用以下規律,進行直接打印。

  • 第n行的m個數可表示為 C(n-1,m-1),即為從n-1個不同元素中取m-1個元素的組合數。
  • 第n行的第m個數和第n-m+1個數相等 ,為組合數性質之一。
  • 每個數字等於上一行的左右兩個數字之和。可用此性質寫出整個楊輝三角。即第n+1行的第i個數等於第n行的第i-1個數和第i個數之和,這也是組合數的性質之一。即 C(n+1,i)=C(n,i)+C(n,i-1)。
    (a+b)n的展開式中的各項系數依次對應楊輝三角的第(n+1)行中的每一項。

簡單來說:
利用二項式定理來解決。例如在楊輝三角中,第3行的三個數恰好對應着兩數和的平方的展開式的每一項的系數,第4行的四個數恰好依次對應兩數和的立方的展開式的每一項的系數,以此類推。
即:

第n行的m個數可表示為C(n-1,m-1),即為從n-1個不同元素中取m-1個元素的組合數。因此可得出二項式定理的公式為:

C(n-1,m-1)=(n-1)!/{(m-1)!(n-m)!}

下面對這個公式來一個簡單的實現

int fac(int a)     //定義一個階乘函數供combi函數調用
{
        int i,ret=1;     //乘階的數據量可能會很大,可以把ret定義為float,
        if(a ==1 || a == 0)
                return 1;
        else{
                for(i=1;i<=a;i++)
                        ret = ret*i;
                return ret;
        }
}

void combi(int n)
{
        int i,j,k;
        for(i=1;i<=n;i++)
        {
                for(j=1;j<=n-i;j++)
                        printf("  ");    //對輸出排版
                for(k=1;k<=i;k++)
                {
                        printf("%4d",fac(i-1)/(fac(k-1)*fac(i-k)));   //利用上述公式進行獲取楊輝三角對應的值
                }
                printf("\n");
        }
}

int main()
{
        int n;
        printf("請輸入:");
        scanf("%d",&n);
        combi(n);
}

可以看出來利用二項式原理,程序邏輯更加的清晰簡潔。但是乘階的計算量比較大,並不贊成使用此種方法。
關於楊輝三角的特性還有很多,有興趣的還可以進行探究。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM