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