杨辉三角C语言
- 格式:doc
- 大小:23.00 KB
- 文档页数:2
P5732杨辉三⾓P5732 杨辉三⾓题⽬描述:给出 n(n≤20),输出杨辉三⾓的前n⾏。
杨辉三⾓是⼀种神奇的三⾓形,它把⼆项式系数图形化,把组合数内在的⼀些代数性质直观地从图形中体现出来,是⼀种离散型的数与形的结合。
杨辉三⾓前6⾏样例为:11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1我们不难发现,每⼀项都等于它上⽅和左上⽅项数之和。
由此我们便可以写出杨辉三⾓的通项公式:a[i][j]=a[i-1][j-1]+a[i-1][j]于是我们便能写出代码:#include<iostream>#include<cstdio>using namespace std;int n,a[25][25];int main(){scanf("%d",&n);a[1][1]=1;a[2][1]=1;a[2][2]=1;a[3][1]=1;a[3][2]=2;a[3][3]=1; //给前⼏项赋值for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){a[i][j]=a[i-1][j-1]+a[i-1][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cout<<a[i][j]<<"";if(i==j) //判断换⾏{cout<<endl;}}}return0;}然⽽运⾏结果却不尽如⼈意,并没有得到杨辉三⾓,反⽽出现了许多很⼤的数。
很明显,程序需要改进。
我们再看⼀下杨辉三⾓。
我们可以发现,它的第⼀列和每⾏最后⼀项都为“1”,即:if(j==1){a[i][j]=1;}if(i==j){a[i][j]=1;}故程序可以升级为:#include<iostream>#include<cstdio>using namespace std;int n,a[25][25];int main(){scanf("%d",&n);a[1][1]=1;a[2][1]=1;a[2][2]=1;a[3][1]=1;a[3][2]=2;a[3][3]=1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){a[i][j]=a[i-1][j-1]+a[i-1][j];if(j==1) //处理第⼀列{a[i][j]=1;}if(i==j) //处理每⾏最后⼀个{a[i][j]=1;}}}for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cout<<a[i][j]<<"";if(i==j){cout<<endl;}}}return0;}此时运⾏就没问题了,可以AC。
杨辉三角的编程思路-概述说明以及解释1.引言1.1 概述杨辉三角是一种数学模式,它以二项式系数为基础构成一个三角形状的数字图案。
它的命名源自中国古代数学家杨辉,他在13世纪提出并发展了这一概念。
杨辉三角具有许多有趣的特点和性质,因此在编程领域中备受关注。
它不仅在理论研究中有广泛的应用,还在实际编程中发挥着重要作用。
通过编程生成杨辉三角,我们能够深入了解其生成规律和数值特征。
同时,杨辉三角也为我们提供了一种探索组合数学和数论等领域的途径。
本文将介绍杨辉三角的定义和特点,并讨论其生成方法。
通过分析其规律和结构,我们将揭示编程生成杨辉三角的思路和方法。
最后,我们将总结编程生成杨辉三角的核心思想,并展望它在实际应用中的潜力。
在下一节中,我们将详细讨论杨辉三角的定义和特点,以便更好地理解它的生成过程。
1.2 文章结构文章结构是指文章中各个部分的组织和安排方式,目的是使读者能够清晰地理解文章的主题和内容。
本文以"杨辉三角的编程思路"为主题,下面将介绍一下文章的结构安排。
文章的结构主要由引言、正文和结论三部分组成。
引言部分介绍了文章的背景和目的,包括概述、文章结构和目的。
在概述中,可以简要介绍杨辉三角的概念和应用领域,引起读者的兴趣。
文章结构部分用于明确告诉读者文章的组织方式,让读者对整篇文章的结构有个整体的了解。
目的部分则明确了本文的写作目标,即介绍杨辉三角的编程思路。
正文部分是文章的核心内容,主要包括杨辉三角的定义和特点,以及生成方法。
在2.1部分中,可以首先介绍什么是杨辉三角,它的定义和特点。
然后,可以深入探讨杨辉三角的生成方法,包括使用递推关系、二项式展开式等方法。
可以结合具体的例子和图表,向读者清晰展示杨辉三角的生成过程和特点。
结论部分对文章进行总结,并展望杨辉三角在实际应用中的潜力。
在3.1部分,可以对杨辉三角的编程思路进行一次简洁明了的总结,强调编程过程中需要注意的关键点和思考方式。
杨辉三角第n项系数公式
杨辉三角第n项系数公式是一个非常有趣且有用的数学公式。
杨辉三角
是一个由数字组成的三角形,其中每个数字是由上面两个数字相加而得到的。
每一行的两边数字都是1,其他数字可以通过前一行来计算得到。
要计算杨辉三角第n行的第k个数字,可以使用以下公式:
C(n,k) = n! / (k! * (n-k)!)
其中,C(n,k)表示组合数, n!表示n的阶乘,k!表示k的阶乘,(n-k)!表
示n-k的阶乘。
通过这个公式,可以快速计算出杨辉三角的任意一项。
举个例子来说,如果我们想要计算杨辉三角的第5行第2个数字,可以
使用公式:
C(5,2) = 5! / (2! * (5-2)!)
= 5! / (2! * 3!)
= (5 * 4 * 3!) / (2! * 3!)
= 5 * 4 / 2
= 10
所以,杨辉三角的第5行第2个数字为10。
杨辉三角的系数公式不仅可以用于计算单个数字,还可以用于解决一些
有趣的数学问题,如排列组合、二项式定理等。
这个公式的发现者杨辉是中
国古代著名的数学家,他的贡献为现代数学研究奠定了基础。
杨辉三角第n项系数公式是一个重要且实用的公式,它可以用于计算杨
辉三角的任意一项,并且在解决各种数学问题中发挥着重要作用。
经典问题(c++python)素数、杨辉三⾓(⾦字塔型)、统计单词数、简单计算器、密码安全。
【编写程序,输⼈⼀个⼤于2的⾃然数,然后输出⼩于该数字的所有素数组成的列表。
】所谓素数,是指除了1和⾃⾝之外没有其他因数的⾃然数,最⼩的素数是2,后⾯依次是3、5、7、11、13...c++代码:#include<iostream>#include<bits/stdc++.h>#define int long longusing namespace std;signed main(){int x;cin >> x;for(int i = 2;i < x;i++){int flag = 0;for(int j = 2;j <= sqrt(i);j++){if(i % j == 0){flag = 1;break;}}if(flag == 0)cout << i << "";}cout << endl;return0;}python代码:import matha = input("请输⼊⼀个⼤于2的整数:")for i in range(2,int(a)):flag = 0for j in range(2,int(math.sqrt(i) + 1)):if i % j == 0:flag = 1breakif flag == 0:print("{} ".format(int(i)))print("\n")【编写程序,格式化输出杨辉三⾓。
】杨辉三⾓即⼆项式定理的系数表,各元素满⾜如下条件:第⼀列及对⾓线上的元素均为1;其余每个元素等于它上⼀⾏同⼀列元素与前⼀列元素之和。
c++代码:#include<bits/stdc++.h>#define int long long#define maxx 9999using namespace std;int a[maxx][maxx];signed main(){int n;cin >> n;//初始化边for(int i = 1;i <= n;i++)//先初始化第⼀列即对⾓线的数值,都为1{a[i][i] = 1;a[i][1] = 1;}//计算出杨辉三⾓的各个值for(int i = 3;i <= n;i++)//从第三⾏第⼆列开始for(int j = 2;j <= i - 1;j++)//每⼀⾏所拥有的列数最⼤值即为当前⾏数减⼀a[i][j] = a[i - 1][j - 1] + a[i - 1][j];//杨辉三⾓的性质,当前元素的值=上⼀⾏同⼀列的值+上⼀⾏前⼀列的值//输出打印for(int i = 1;i <= n;i++)//注意观察以下两个for循环的边界条件,之和为n,这有助于你的理解{for(int j = 1;j <= n - i;j++)//先打印空格cout << "";for(int k = 1;k <= i;k++)//再打印数值(数值后带⼀个空格)cout << a[i][k] << "";cout << endl;}return0;}python代码:import mathimport numpy as npn = eval(input("请输⼊⼀个整数:"))#a = np.zeros((n,n),dtype = np.int)#下⾯使⽤了列表推导式。
1.package com.xyq.demo;2.public class Triangle {3.4./**5.* @param args6.*/7.8.public static void main(String[] args) {9.a(); //打印正等腰三角10. b(); //打印倒等腰三角11. c(); //打印直边靠左正直角三角12. d(); //打印直边靠右正直角三角13. e(); //打印直边靠左倒直角三角14. f(); //打印直边靠右倒直角三角15. g(); //打印底边靠左钝角角三角16. h(); //打印底边靠右钝角角三角17. }18. /**19.* 作用:打印正等腰三角20.*/21. public static void a(){22. System.out.println("打印正等腰三角");23. int i ,j;24. for(i=1;i<=5;i++){25. for(j=5;j>i;j--){26. System.out.print(" ");27. }28. for(j=0;j<i*2-1;j++){29. System.out.print("*");30. }31. System.out.println();32. }33. }34.35. /**36.* 打印倒等腰三角37.*/38. public static void b(){39. System.out.println("打印倒等腰三角");40. int i ,j ;41. for(i=1;i<=5;i++){42. for(j=1;j<i;j++){43. System.out.print(" ");44. }45. for(j=10;j>i*2-1;j--){46. System.out.print("*");47. }48. System.out.println();49. }50. }51. /**52.* 打印直边靠左正直角三角53.*/54. public static void c(){55. System.out.println("打印直边靠左正直角三角");56. int i ,j ;57. for(i=1;i<=5;i++){58. for(j=0;j<i;j++){59. System.out.print("*");60. }61. System.out.println();62. }63. }64.65. /**66.* 打印直边靠右正直角三角67.*/68. public static void d(){69. System.out.println("打印直边靠右正直角三角");70. int i ,j;71. for(i=1;i<=5;i++){72. for(j=5;j>i;j--){73. System.out.print(" ");74. }75. for(j=0;j<i;j++){76. System.out.print("*");77. }78. System.out.println();79. }80. }81. /**82.* 打印直边靠左倒直角三角83.*/84. public static void e(){85. System.out.println("打印直边靠左倒直角三角");86. int i ,j;87. for(i=1;i<=5;i++){88. for(j=5;j>=i;j--){89. System.out.print("*");90. }91. System.out.println();92. }93. }94. /**95.* 打印直边靠右倒直角三角96.*/97. public static void f(){98. System.out.println("打印直边靠右倒直角三角");99. int i ,j;100.for(i=1;i<=5;i++){101.for(j=1;j<i;j++){102.System.out.print(" ");103.}104.for(j=5;j>=i;j--){105.System.out.print("*");106.}107.System.out.println();108.}109.}110./**111.* 打印底边靠左钝角角三角112.*/113.public static void g(){114.System.out.println("打印底边靠左钝角角三角");115.int i ,j ;116.for(i=1;i<=5;i++){117.for(j=0;j<i;j++){118.System.out.print("*");119.}120.System.out.println();121.}122.for(i=1;i<5;i++){123.for(j=5;j>i;j--){124.System.out.print("*");125.}126.System.out.println();127.}128.}129./**130.* 打印底边靠右钝角角三角131.*/132.public static void h(){133.System.out.print("打印底边靠右钝角角三角");134.int i,j;135.for(i=0;i<=5;i++){136.for(j=5;j>i;j--){137.System.out.print(" ");138.}139.for(j=0;j<i;j++){140.System.out.print("*");141.}142.System.out.println();143.}144.for(i=1;i<5;i++){145.for(j=0;j<i;j++){146.System.out.print(" ");147.}148.for(j=5;j>i;j--){149.System.out.print("*");150.}151.System.out.println();152.}153.}154.}逆序的各种算法:1.public class Reverse {2.public static void main(String[] args) {3.//定义的字符4.String s = "华中爱我";5.6.7.//通过String的subString方法8.int len = s.length();9.String sub_reverse = "";10. for (int i = len; i > 0; i--)11. sub_reverse += s.substring(i - 1,i); //返回子字符串,开始于i-1结束于i12. System.out.println("通过substring方法逆序: "+sub_reverse);13.14.15.//通过Sring的StringBuffer方法逆序16. String buffer_reverse;17. buffer_reverse=(new StringBuffer(s).reverse()).toString();18. System.out.println("通过StringBuffer方法逆序: "+buffer_reverse);19.20.21.//通过数组实现字符串逆序22. char[] c = s.toCharArray();23. char[] temp = new char[c.length];24. for (int i = 0, j = c.length - 1; i< c.length; i++, j--) {25. temp[j] = c[i];26. }27. System.out.println("通过数组来逆序: "+buffer_reverse);28.29.30.31.32. }33.}c用for循环打印三角形直角空心直角,等腰,等腰空心c用for循环打印三角形,直角,空心直角,等腰,等腰空心34.直角三角形 t11.c35.#include36.main()37.{38. int i,j;39. for (i=1;i<=10;i++) {40. for (j=1;j<=i;j++) {41. printf("*");42. }43. printf("\n");44. }45.}46.47.直角空心三角形 t12.c48.#include49.main()50.{51. int i,j;52. for (i=1;i<=10;i++) {53. for (j=1;j<=i;j++) {54. if (j==1 || j==i|| i==10)55.printf("*");56. else57.printf(" ");58. }59. printf("\n");60. }61.}62.等腰三角形 t13.c63.#include64.main()65.{66. int i,j;67. for (i=1;i<=10;i++) {68. for (j=1;j<=10-i;j++)69. printf(" ");70. for (j=1;j<=2*i-1;j++)71. printf("*");72. printf("\n");73. }74.}75.等腰空心三角形 t14.c76.#include77.main()78.{79. int i,j;80. for (i=1;i<=10;i++) {81. for (j=1;j<=10-i;j++)82. printf(" ");83. for (j=1;j<=2*i-1;j++) {84. if (j==1 ||j==2*i-1 || i==10)85.printf("*");86. else87.printf(" ");88. }89. printf("\n");90. }91.}。
杨辉三角的递推公式杨辉三角,这可是数学世界里一个相当有趣的存在!咱们先来说说啥是杨辉三角。
它是一个三角形的数阵,每行数字左右对称,由 1 开始逐渐变大,然后再逐渐变小,最后回到 1 。
就像一个排列整齐的数字大军,非常有规律。
那杨辉三角的递推公式是啥呢?其实就是通过前面一行的数字来计算得出下一行的数字。
具体来说,如果我们把杨辉三角的第 n 行第 m 个数记为 C(n,m) ,那么递推公式就是:C(n,m) = C(n - 1,m - 1) + C(n - 1,m) 。
这个公式看起来有点复杂,但咱们一点点来理解。
我记得之前给学生们讲这个的时候,有个小同学瞪着大眼睛问我:“老师,这有啥用啊?”我笑了笑,给他举了个例子。
比如说咱们要算从 5 个不同的水果里选 2 个的组合数,这时候杨辉三角的递推公式就能派上用场啦。
咱们先找到第 5 行,然后找到第 2 个数,就能得出答案。
咱们再深入点讲讲这个递推公式的妙处。
它就像是一个神奇的魔法咒语,能让我们在数字的世界里畅游。
通过不断地运用这个公式,我们可以快速地填满整个杨辉三角,就像在拼图游戏中一块一块地拼凑出完整的画面。
想象一下,我们就像是数字世界的建筑师,用这个递推公式一砖一瓦地搭建起杨辉三角这座宏伟的数字大厦。
每一行、每一个数字都在我们的掌控之中,那种感觉简直太棒了!而且啊,杨辉三角的递推公式可不只是在数学课本里才有意义。
在实际生活中,它也能帮我们解决很多问题呢。
比如说在概率计算中,它可以帮助我们算出各种可能性的数量;在编码理论中,它能优化信息的存储和传输。
还记得有一次,我和几个朋友一起玩猜数字的游戏。
游戏规则是我心里想一个数字,然后他们通过提问来猜出这个数字。
我就突然想到了杨辉三角的递推公式,我把数字的范围想象成杨辉三角的行数,然后根据他们的提问,用类似递推的方式缩小范围,最后他们费了好大劲才猜中。
这让我更加深刻地体会到了杨辉三角递推公式的巧妙之处。
总之,杨辉三角的递推公式虽然看起来有点神秘,但只要我们用心去理解、去运用,就能发现它就像一把万能钥匙,能打开数学世界里一扇又一扇神奇的大门。
/*Name: 杨辉三角算法集锦分别使用了二维数组,一维数组,队列,二项式公式,组合公式推论和递归方法等9种算法*/#include<iostream>#include<iomanip>using namespace std;const int MAXROW = 40;void PrintBlank(int n);int Com(int n, int m);int Try(int row, int cel);void Fun_1(int row);void Fun_2(int row);void Fun_3(int row);void Fun_4(int row);void Fun_5(int row);void Fun_6(int row);void Fun_7(int row);void Fun_8(int row);void Fun_9(int row);int main(){int row;cin >> row;Fun_1(row);cout << endl;Fun_2(row);cout << endl;Fun_3(row);cout << endl;Fun_4(row);cout << endl;Fun_5(row);cout << endl;Fun_6(row);cout << endl;Fun_7(row);cout << endl;Fun_8(row);cout << endl;Fun_9(row);system("pause");return 0;}//输出n个空格void PrintBlank(int n){for (int i=0; i<n; i++)cout << ' ';}//使用二维数组输出杨辉三角void Fun_1(int row){const int DIS = 6;int blank = 32;int a[MAXROW][MAXROW] = {0};for (int i=0; i<row; i++){PrintBlank(blank-=DIS/2);//输出第i行空格 for (int j=0; j<=i; j++){if (j == 0 || j == i)a[i][j] = 1;else //规律: 左上与正上元素之和a[i][j] = a[i-1][j-1] + a[i-1][j];cout << setw(DIS) << a[i][j];if (j == i)cout << endl;}}}//使用队列输出杨辉三角void Fun_2(int row){const int DIS = 6;int max = row + 2;int blank = 30;int *a = new int[max];int front, rear;front = 0; a[0] = 1;rear = 1; a[1] = 1;PrintBlank(blank);//输出第一行空格while (front != (rear+1)%max){if (a[front] == 1 && a[(front+1)%max] == 1)//到i-1行尾部{rear = (rear+1)%max; a[rear] = 1; //第i行尾部rear = (rear+1)%max; a[rear] = 1; //队尾进入第i+1行cout << setw(DIS) << 1 << endl; //输出第i-1行尾部front = (front+1)%max; //对头进入第i行PrintBlank(blank-=DIS/2);//输出第i行空格}//处理中间数据rear = (rear+1)%max; a[rear] = a[front] + a[(front+1)%max]; if (front != rear)//队列非空时输出cout << setw(DIS) << a[front]; //输出对头front = (front+1)%max; //删除对头元素}delete []a;}//使用两个一维数组代替二维数组输出杨辉三角void Fun_3(int row){const int DIS = 6;int blank = 33;int *a = new int[row]; //存储下一行int *b = new int[row];//存储输出行b[0] = 1;for (int n=1; n<=row; n++){//输出第n行PrintBlank(blank-=DIS/2);cout << setw(DIS) << b[i];cout << endl;if (n == row)//已经到最后一行则不再复制continue;//生成第n+1行数据a[0] = b[0];for (int i=1; i<n; i++)a[i] = b[i] + b[i-1];a[n] = 1;//复制第n+1行数据for (int i=0; i<=n; i++)b[i] = a[i];}delete []a;delete []b;}//使用一个一维数组和两个临时变量代替二维数组输出杨辉三角:很巧妙void Fun_4(int row){const int DIS = 6;int blank = 30;int *a = new int[row]; //存储输出行int left, right;//输出第一行PrintBlank(blank);//输出第1行空格cout << setw(DIS) << 1 << endl;a[0] = 1;//左侧数据永远为1for (int n=1; n<row; n++){left = a[0];//生成第n行数据for (int i=1; i<n; i++)//设置中间数据{right = a[i];a[i] = left + right;//left=a[i-1],right=a[i]left = right;}a[n] = 1;//设置右侧的数据1//输出第n行PrintBlank(blank-=DIS/2);cout << setw(DIS) << a[i];cout << endl;}delete []a;}//使用一个一维数组和两个临时变量代替二维数组输出杨辉三角:方法同Fun_4,但更具有技巧,有点难懂void Fun_5(int row){const int DIS = 6;int blank = 33;int *a = new int[row]; //存储输出行for (int i=1; i<row; i++)//赋初值0,这个很重要,因为后面有用到 a[i] = 0;a[0] = 1;int left, right;for (int n=1; n<=row; n++){left = 0;//生成第n行数据for (int i=0; i<n; i++){right = a[i];a[i] = left + right;//left=a[i-1],right=a[i]left = right;}//输出第n行PrintBlank(blank-=DIS/2);for (int i=0; i<n; i++)cout << setw(DIS) << a[i];cout << endl;}delete []a;}//使用一个一维数组输出杨辉三角;两侧的1不变,计算中间的元素void Fun_6(int row){const int DIS = 6;int blank = 30;int *a = new int[row];//输出第一行PrintBlank(blank);//输出第1行空格cout << setw(DIS) << 1 << endl;a[0] = 1;//最左侧为1,永远不变for (int n=1; n<row; n++){a[n] = 1; //设置最右侧的1for (int i=n-1; i>0; i--)//设置中间的元素,由于a[i]的值变化,故应从右到左计算{a[i] += a[i-1]; //杨辉三角的规律}//输出第n+1行PrintBlank(blank-=DIS/2);for (int i=0; i<=n; i++)cout << setw(DIS) << a[i];cout << endl;}delete []a;}//使用二项式定理输出杨辉三角void Fun_7(int row){const int DIS = 6;int blank = 30;//输出第一行PrintBlank(blank);//输出第1行空格cout << setw(DIS) << 1 << endl;for (int i=1; i<row; i++){PrintBlank(blank-=DIS/2);//输出第i行空格for (int j=0; j<i; j++){cout << setw(DIS) << Com(i, j);}cout << setw(DIS) << 1 << endl;//输出每行最后一个1}}//输出组合c(n,m)int Com(int n, int m){int s1 = 1;int s2 = 1;m = (m > n/2) ? (n - m) : m;//取小的,以减少计算量for (int i=1; i<=m; i++){s1 *= n;s2 *= i;if (s1 % s2 == 0)//防止溢出{s1 /= s2;s2 = 1;}n--;}return s1;}//使用组合公式推论输出杨辉三角 :C(n,m) = (n-m+1)/m * C(n,m-1) void Fun_8(int row){const int DIS = 6;int blank = 30;//输出第一行PrintBlank(blank);//输出第1行空格cout << setw(DIS) << 1 << endl;for (int n=1; n<row; n++){int c = 1;PrintBlank(blank-=DIS/2);//输出第i行空格cout << setw(DIS) << c; //输出每行第一个1for (int m=1; m<n; m++)//输出中间元素{c = c * (n - m + 1) / m;cout << setw(DIS) << c;}cout << setw(DIS) << 1 << endl;//输出每行最后一个1 }}//使用递归方法输出杨辉三角 :C(n,k) = 1 (k=0或者n=k);C(n,k) = C(n-1,k-1) + C(n-1,k)void Fun_9(int row){const int DIS = 6;int blank = 33;for (int n=0; n<row; n++){PrintBlank(blank-=DIS/2);//输出第i行空格for (int m=0; m<=n; m++)//输出中间元素{cout << setw(DIS) << Try(n, m);}cout << endl;//输出每行最后一个1}}//递归函数,输出杨辉三角 :C(n,k) = 1 (k=0或者n=k);C(n,k) = C(n-1,k-1) + C(n-1,k)int Try(int n, int k){if (k == 0 || k == n)//在左右两侧返回1return 1;return Try(n-1,k-1) + Try(n-1,k);//递推公式}。
杨辉三角形10个规律
1. 杨辉三角形第n行有n个数。
2. 第n行的第k个数是第n-1行的第k-1和第k个数之和。
3. 杨辉三角形对称,对于第n行的第k个数,它也等于第n行
的第(n-k+1)个数。
4. 第n行的所有数之和等于2的(n-1)次方。
5. 第n行的中心数是第(n+1)/2个数,其值为组合数C(n,
(n+1)/2)或(2n-1)/n。
6. 杨辉三角形第n行的数都是以2的n-1次方为中心轴对称的。
7. 杨辉三角形第n行各数大小为C(n,0)、C(n,1)、C(n,2)、…、C(n,n)。
8. 杨辉三角形每行的奇数项之和等于2的(n-1)次方,每行的偶数项之和等于2的(n-1)次方减去第n项。
9. 杨辉三角形的右上部分即为组合数C(m,n),左下部分即为
排列数A(m,n)。
10. 杨辉三角形是二项式定理的几何例子。
杨辉三角形(在国外亦被称为Pascal三角形)
编写函数, 输出杨辉三角形。
void Pascal(int n);
例如: Pascal(9)输出下面的杨辉三角形。
1
1 1
1 2 1
1 3 3 1
集训练习
- 7 -
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
提示: 一种方法是利用前面的组合数函数来计算, 效率较低; 另一种方法则是利用每行中相邻两列
数据之间的关系来计算: 每行的第一个数据总是1, 后一列数据可直接由前一列数据推导得到, 效率较高。
详细代码如下:
#include<stdio.h>
void Pascal(int n);
int c(int x,int y);
void main()
{
int n=14;
printf("N=");
while(n>12)
scanf("%d",&n);/*控制输入正确的值以保证屏幕显示的图形正确*/ Pascal(n);
}
void Pascal(int n)
{ int i,j;
for(i=0;i<=n;i++) /*控制输出N行*/
{
for(j=0;j<24-2*i;j++) printf(" "); /*控制输出第i行前面的空格*/
for(j=1;j<i+2;j++) printf("%4d",c(i,j)); /*输出第i行的第j个值*/
printf("\n");
}
}
int c(int x,int y) /*求杨辉三角形中第x行第y列的值*/
{
int z;
if((y==1)||(y==x+1)) return 1; /*若为x行的第1或第x+1列,则输出1*/
z=c(x-1,y-1)+c(x-1,y); /*否则,其值为前一行中第y-1列与第y列值之和*/ return z;
}。