从算法学起C语言--杨辉三角

转载请注明出处,珍惜下劳动成果撒~~


背景说明:


杨辉三角,又称帕斯卡三角形,巴斯卡三角形(外国货这么叫),有史为证源于中国。

1 261年,我国南宋数学家杨辉在他的著作《详解九章算法》中记载着一张珍贵的图形--------“开方作法本源”图。根据杨辉自注,此图“出《释锁算书》,贾宪用此术”,就是说这张图是贾宪(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");

}

最后运行下查看结果 : 

完美执行~!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值