從演算法學起C語言--楊輝三角
阿新 • • 發佈:2019-02-15
轉載請註明出處,珍惜下勞動成果撒~~
背景說明:
楊輝三角,又稱帕斯卡三角形,巴斯卡三角形(外國貨這麼叫),有史為證源於中國。
1261年,我國南宋數學家楊輝在他的著作《詳解九章演算法》中記載著一張珍貴的圖形--------“開方作法本源”圖。根據楊輝自注,此圖“出《釋鎖算書》,賈憲用此術”,就是說這張圖是賈憲(11世紀)創造的,賈憲製作這張表進行開方運算,因其形似三角形,因此我們稱之為“賈憲三角形”,又稱“楊輝三角”。歐洲人一般稱它為“帕斯卡三角形”,認為是法國科學家帕斯卡(1623~1662)首創的。中國和阿拉伯的數學家獨立發明這個三角形都要早於歐洲。近些年來國外也逐漸承認這項成果屬於中國,有些數學史書上開始稱它為“中國三角形”(Chinese triangle)了。int j,i; int a[11][20]; for(i=0;i<10;i++) { for(j=0;j<=i;j++) { if(j<1)a[i][j]=1; else if(i==0)break; else a[i][j]=a[i-1][j-1]+a[i-1][j]; } }
ok,你以為到這裡就結束了??no!下面我們來繼續找規律。 看n=6的時候,1,6,15,20,15,6,1. 第一個值是1,這是規定死的,然後最後一個值是1,中間的值如果不看上面的元素,僅僅在當前行找到一絲絲關聯,看起來不容易,其實灰常簡單明瞭。請看:當第七行第1個元素時,即用座標的表示方式為(6,0),值為1,當為(6,1)時,值為6,以此類推: (6,0)->1; (6,1)->6; (6,2)->15; (6,3)->20; (6,4)->15; (6,5)->6; (6,6)->1;寫成如下表達式: 6 = 1 * 6 / 1 ; 15 = 6 * 5 / 2 ; 20 = 15 * 4 / 3 ; 15 = 20 * 3 / 4 ; 6 = 15 * 2 / 5 ; 1 = 6 * 1 / 6 ; 規律顯而易見: 從第0個元素為1開始,此後的每個元素為 前一個元素 * 一個表示式 : s = s * (n - r + 1) / r ;其中n為列,r為行。 所以獲取每個元素值的程式碼就可以封裝成一個方法 :
int chinaYang(int n,int r) { int i; int s = 1;//這裡初始化s為1是為了當r為0的時候返回1,即每行的第一個元素為1. for(i = 1; i <= r ; i++) s = s * (n-i+1)/i; return s; }
剩下就是一些排版的小問題,寫成main入口如下:
main(void)
{
int i,n,r;
for (n = 0;n <= N; n++)
{
for (r = 0 ; r <= n ; r++)
{
if(r == 0)
for(i = 0 ; i <= (N-n) ; i++)
printf(" ");
else
printf(" ");
printf("%3d",chinaYang(n,r));
}
printf("\n");
}
system("pause");
}
最後執行下檢視結果 :
完美執行~!