1. 程式人生 > >從演算法學起C語言--楊輝三角

從演算法學起C語言--楊輝三角

轉載請註明出處,珍惜下勞動成果撒~~

背景說明:

楊輝三角,又稱帕斯卡三角形,巴斯卡三角形(外國貨這麼叫),有史為證源於中國。

1261年,我國南宋數學家楊輝在他的著作《詳解九章演算法》中記載著一張珍貴的圖形--------“開方作法本源”圖。根據楊輝自注,此圖“出《釋鎖算書》,賈憲用此術”,就是說這張圖是賈憲(11世紀)創造的,賈憲製作這張表進行開方運算,因其形似三角形,因此我們稱之為“賈憲三角形”,又稱“楊輝三角”。歐洲人一般稱它為“帕斯卡三角形”,認為是法國科學家帕斯卡(1623~1662)首創的。中國和阿拉伯的數學家獨立發明這個三角形都要早於歐洲近些年來國外也逐漸承認這項成果屬於中國,有些數學史書上開始稱它為“中國三角形”(Chinese triangle)了。
以上摘自百度百科 楊輝三角,眾所周知的一個數列三角形: 這個三角形有很直觀的規律,從第二行開始,每個元素可以認為是它肩上的兩個元素的和值。這個規律估計初中生甚至小學生都知道,關於楊輝三角的C演算法的例子更是多的很,在此處打算用兩種演算法來詮釋楊輝三角的程式碼。 首先最顯而易見的就是上述的規律,用和值來判斷每個元素的值,非常明瞭,陣列解決即可。
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");

}

最後執行下檢視結果 : 
完美執行~!