词条 | 杨辉三角 |
释义 | 杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。 c#输出杨辉三角class Program { public void yanghui(int value) { if (value < 3) { Console.WriteLine("请重新输入数组大于3的值!"); } else { int[,] arry = new int[value, value]; Console.WriteLine("数组为:"); for (int i = 0; i < value; i++) { for (int j = 0; j <= i; j++) { if (i == j || j == 0) { arry[i, j] = 1; } else { arry[i, j] = arry[i - 1, j - 1] + arry[i - 1, j]; } Console.Write(arry[i, j] + " "); } Console.WriteLine(); } } } static void Main(string[] args) { Program p = new Program(); Console.WriteLine("请输入数组值:"); string str_name = Console.ReadLine(); int value = Convert.ToInt16(str_name); p.yanghui(value); } } 性质1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 2、第n行的数字个数为n个。 3、第n行数字和为2^(n-1)。(2的(n-1)次方) 4、每个数字等于上一行的左右两个数字之和。可用此性质写出整个帕斯卡三角形。 5、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第2n个斐波那契数。将第2n行第2个数,跟第2n+1行第4个数、第2n+2行第6个数……这些数之和是第2n-1个斐波那契数。 6、第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为1×(n-1)×(n-2)/2×(n-3)/3…依此类推。 7.两个未知数和的n次方运算后的各项系数依次为杨辉三角的第(n+1)行。 介绍其实,中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而杨辉三角的发现就是十分精彩的一页。 历史杨辉三角历史北宋人贾宪约1050年首先使用“贾宪三角”进行高次开方运算。 11世纪中国宋代数学家杨辉在《详解九章算法》里讨论这种形式的数表,并说明此表引自11世纪前半贾宪的《释锁算术》,并绘画了“古法七乘方图”。故此,杨辉三角又被称为“贾宪三角”。 元朝数学家朱世杰在《四元玉鉴》(1303年)扩充了“贾宪三角”成“古法七乘方图”。 意大利人称之为“塔塔利亚三角形”(Triangolo di Tartaglia)以纪念在16世纪发现一元三次方程解的塔塔利亚。 在欧洲直到1623年以后,法国数学家帕斯卡在13岁时发现了“帕斯卡三角”。 布莱士·帕斯卡的著作Traité du triangle arithmétique(1655年)介绍了这个三角形。帕斯卡搜集了几个关于它的结果,并以此解决一些概率论上的问题,影响面广泛,Pierre Raymond de Montmort(1708年)和亚伯拉罕·棣·美弗(1730年)都用帕斯卡来称呼这个三角形。 近年来国外也逐渐承认这项成果属于中国,所以有些书上称这是“中国三角形”(Chinese triangle) 历史上曾经独立绘制过这种图表的数学家 ·贾宪 中国北宋 11世纪 《释锁算术》 ·杨辉 中国南宋1261《详解九章算法》记载之功 ·朱世杰 中国元代 1299《四元玉鉴》级数求和公式 ·阿尔·卡西 阿拉伯 1427《算术的钥匙》 ·阿皮亚纳斯德国 1527 ·施蒂费尔 德国 1544《综合算术》二项式展开式系数 ·薛贝尔 法国 1545 ·B·帕斯卡 法国 1654《论算术三角形》 杨辉三角的三个基本性质主要是二项展开式的二项式系数即组合数的性质,它是研究杨辉三角其他规律的基础。杨辉三角横行的数字规律主要包括横行各数之间的大小关系。组合关系以及不同横行数字之间的联系。 杨辉,字谦光,南宋时期杭州人。在他1261年所著的《详解九章算法》一书中,辑录了如上所示的三角形数表,称之为“开方作法本源”图。 同时,这也是多项式(a+b)^n 打开括号后的各个项的二次项系数的规律。 因此,杨辉三角第x层第y项直接就是(y nCr x)。我们也不难得到,第x层的所有项的总和为2^(x-1) (即(a+b)^x中a,b都为1的时候) 。上述y^x 指y的x次方,(a nCr b) 指组合数。 而这样一个三角在我们的奥数竞赛中也是经常用到,最简单的就是要找规律。 简单的说,就是两个未知数和的幂次方运算后的系数问题,比如(x+y)²=x²+2xy+y²,这样系数就是1,2,1这就是杨辉三角的其中一行,立方,四次方,运算的结果看看各项的系数,你就明白其中的道理了。 这就是杨辉三角,也叫贾宪三角,在外国被称为帕斯卡三角(Pascal'sTriangle)。 他与我们现在的学习联系最紧密的是2项式乘方展开式的系数规律。如图,在贾宪三角中,第3行的第三个数恰好对应着两数和的平方公式(在此就不做说明了)依次下去, 杨辉三角前12行第 1 行: 1 第 2 行: 1 1 第 3 行: 1 2 1 第 4 行: 1 3 3 1 第 5 行: 1 4 6 4 1 第 6 行: 1 5 10 10 5 1 第 7 行: 1 6 15 20 15 6 1 第 8 行: 1 7 21 35 35 21 7 1 第 9 行: 1 8 28 56 70 56 28 8 1 第 10 行: 1 9 36 84 126 126 84 36 9 1 第 11 行: 1 10 45 120 210 252 210 120 45 10 1 第 12 行: 1 11 55 165 330 462 462 330 165 55 11 1 常用公式:(a+b)²=a²+2ab+b²根据杨辉三角 可得 (a+b)³=a³+3a²b+3ab²+b³ 以此类推 分别将a降幂 b升幂 例如: ,它的两项的系数是1和1 ,它的三项系数依次是1、2、1 ,它的四项系数依次1、3、3、1 数形趣遇 算式到算图二项式定理与杨辉三角形是一对天然的数形趣遇,它把数形结合带进了计算数学。 求二项式展开式系数的问题,实际上是一种组合数的计算问题. 用系数通项公式来计算,称为“式算”;用杨辉三角形来计算,称作“图算”。 【图算】常数项产生在展开后的第5、6两项. 用“错位加法”很容易“加出”杨辉三角形第8行的第5个数。 简图如下: 1 4 6 4 1 1 5 10 10 5 1 …… 15 20 15 6 … 1 …… 35 35 21 …… … 70 56 … 图上得到=70,==56. 故求得展开式中常数项为70 – 2×56 = – 42 【点评】 “式算”与“图算”趣遇,各扬所长,各补所短。<, /o:p> 杨辉三角形本来就是二项式展开式的算图. 对杨辉三角形熟悉的考生,比如他熟悉到了它的第6行: 1,6,15,20,15,6,1 那么他可以心算不动笔,对本题做到一望而答。 杨辉三角形在3年内考了5个(相关的)题目,这正是高考改革强调“多想少算”、“逻辑思维与直觉思维并重”的结果. 这5个考题都与二项式展开式的系数相关,说明数形结合思想正在高考命题中进行深层次地渗透。 利用二项式推出牛顿切线法开方 开立方公式: 设A = X^3,求X.称为开立方。 开立方有一个标准的公式:X(n+1)=Xn+(A/X^2-Xn)1/3(n,n+1是下角标) 例如,A=5,,即求 5介于1的3次方;至2的3次方;之间(1的3次方=1,2的3次方=8) 初始值X0可以取1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,都可以。例如我们取X0 = 1.9按照公式: 第一步:X1=1.9+(5/1.9^2;-1.9)1/3=1.7。 即5/1.9×1.9=1.3850416,1.3850416-1.9=-0.5149584,-0.5149584×1/3=-0.1716528,1.9+(-0.1716528)=1.7。即取2位数值,,即1.7。 第二步:X2=1.7+(5/1.7^2;-1.7)1/3=1.71。 即5/1.7×1.7=1.73010,1.73-1.7=0.03,0.03×1/3=0.01,1.7+0.01=1.71。取3位数,比前面多取一位数。 第三步:X3=1.71+(5/1.71^2;-1.71)1/3=1.709. 第四步:X4=1.709+(5/1.709^2;-1.709)1/3=1.7099 这种方法可以自动调节,第一步与第三步取值偏大,但是计算出来以后输出值会自动转小;第二步,第四步输入值 偏小,输出值自动转大。即5=1.7099^3; 当然初始值X0也可以取1.1,1.2,1.3,。。。1.8,1.9中的任何一个,都是X1 = 1.7 > 。当然,我们在实际中初始值最好采用中间值,即1.5。 1.5+(5/1.5²-1.5)1/3=1.7。 如果用这个公式开平方,只需将3改成2,2改成1。即 X(n + 1) = Xn + (A / Xn-Xn)1 / 2. 例如,A=5: 5介于2的平方至3的平方;之间。我们取初始值2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9都可以,我们最好取 中间值2.5。 第一步:2.5+(5/2.5-2.5)1/2=2.2; 即5/2.5=2,2-2.5=-0.5,-0.5×1/2=-0.25,2.5+(-0.25)=2.25,取2位数2.2。 第二步:2.2+(5/2.2-2.2)1/2=2.23; 即5/2.2=2.272,2.272-2.2=-0.072,-0.072×1/2=-0.036,2.2+0.036=2.23。取3位数。 第三步:2.23+(5/2.23-2.23)1/2=2.236。 即5/2.23=2.242,2.242-2.23=0.012,0.012×1/2=0.006,2.23+0.006=2.236. 每一步多取一位数。这个方法又叫反馈开方,即使你输入一个错误的数值,也没有关系,输出值会自动调节,接近准确值。 A=(X±Y)^n=展开。带入公式就是开方公式。X(n+1)=Xn+(A/X^(k-1)-Xn)1/k=Xn-f(x)/f‘(x)。 f'(x)=kx^(K-1);f(X)=X^K-A。即牛顿切线法 就是在开方过程中把牛顿二项式定理转换成为牛顿切线法。 二项式定理的证明 采用数学归纳法可行。 C语言输出杨辉三角直角三角形杨辉三角//c语言,求直角的 #include<stdio.h> #define M 10 void main() { int a[M][M], i , j ; for(i=0;i<M;i++) for(j=0;j<=i;j++) { if(i==j||j==0) a[i][j]=1; else a[i][j]=a[i-1][j]+a[i-1][j-1]; printf("%d",a[i][j]); if(i==j)printf("\"); } } 使用数组打印金字塔型杨辉三角 #include<stdio.h> void main() { int a[10][10],i,j; for(i=0;i<10;i++) { for(j=10;j>=i;j--) printf("%2c",' ');/*两个空格*/ for(j=0;j<=i;j++) { if(i==j||j==0) a[i][j]=1; else a[i][j]=a[i-1][j]+a[i-1][j-1]; printf("%3d ",a[i][j]); /*%3d后一个空格*/ if(i==j) printf("\"); } } } 不用数组输出金字塔形杨辉三角 #include<stdio.h> #define N 10 void main() { unsigned int i,j,k; unsigned int b,c; for(i=0;i<N;i++) { for(j=N;j>i;j--) printf(""); for(j=0;j<=i;j++) { b=c=1; if(j>=1) { for(k=i-j+1;k<=i;k++) b*=k; for(k=1;k<=j;k++) c*=k; } printf("%4d",b/c); } printf("\"); } } 注解: 在打印杨辉三角时通常用到杨辉三角的两个性质。 第一个就是杨辉三角中除了最外层(不包括杨辉三角底边)的数为1外,其余的数都是它肩上两个数之和。用数组输出杨辉三角就用这个性质。 第二个性质是杨辉三角的第n行恰好是C(n,0)~C(n,n)。这里的C表示组合。不用数组输出杨辉三角就用这个性质。把杨辉三角的前15行保存在文本文件中 #include<stdio.h> #include<stdlib.h> #define M 15 void main() { FILE *out; if((out=fopen("D:\\\\text_1.txt","w"))==NULL) { printf("Error!\"); exit(0); } int a[M][M],i,j; for(i=0;i<M;i++) for(j=0;j<=i;j++) { if(i==j||j==0) a[i][j]=1; else a[i][j]=a[i-1][j]+a[i-1][j-1]; fprintf(out,"%5d",a[j]); if(i==j) fputc('\',out); } fclose(out); } 用二维数组输出前十行: #include <stdio.h> int main () { int a[10][10],i,j; for(i=0;i<10;i++) { a[i][i]=1; a[i][0]=1; } for (i=2;i<10;i++) for (j=1;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<10;i++) { for (j=0;j<=i;j++) printf("%6d",a[i][j]); printf("\"); } printf("\"); return 0; } VB输出杨辉三角Private Sub Form_click() n = Val(Text1.Text) ReDim a(n + 1, n + 1), b(n + 1, n + 1) Cls k = 8 For i = 1 To n Print String((n - i) * k / 2 + 1, " "); For j = 1 To i a(i, 1) = 1 a(i, i) = 1 a(i + 1, j + 1) = a(i, j) + a(i, j + 1) b(i, j) = Trim(Str(a(i, j))) Print b(i, j); String(k - Len(b(i, j)), " "); Next j Next i End Sub 创建一个text和command,在text中输入所需行数,点击command即可。一个数在杨辉三角出现的次数由1开始,正整数在杨辉三角形出现的次数为∞:1, 2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 2, 4, ... (OEIS:A003016)。最小而又大于1的数在贾宪三角形至少出现n次的数为2, 3, 6, 10, 120, 120, 3003, 3003, ... (OEIS:A062527) 除了1之外,所有正整数都出现有限次。 只有2出现刚好一次。 6,20,70等出现三次。 出现两次和四次的数很多。 还未能找到出现刚好五次的数。 120,210,1540等出现刚好六次。(OEIS:A098565) 因为丢番图方程 : 有无穷个解,所以出现至少六次的数有无穷个多。 其解答,是 其中Fn表示第n个斐波那契数(F1 = F2 = 1)。 3003是第一个出现八次的数。 一道NOIP杨辉三角题目: #include<stdio.h> #define maxn 50 const int y=2009; int main() { int n,c[maxn][maxn],i,j,s=0; scanf("%d",&n); c[0][0]=1; for(i=1;i<=n;i++) { c[i][0]=1; for(j=1;j<i;j++) c[i][j]=c[i-1][j-1]+c[i-1][j]; c[i][i]=1; } for(i=0;i<=n;i++) s=(s+c[n][i])%y; printf("%d\",s); return 0; 此为利用数组求和 Java实现代码: public class YhuiTest { public static void main(String[] args) { final int Row = 6; int yh[][] = new int[Row][Row]; for (int i = 0; i < Row; i++) { yh[i][0] = 1; yh[i][i] = 1; } for (int i = 2; i < Row; i++) { for (int j = 1; j < Row; j++) { yh[i][j] = yh[i - 1][j - 1] + yh[i - 1][j]; } } for (int i = 0; i < Row; i++) { for (int j = 0; j <= i; j++) { System.out.print(yh[i][j] + " "); } System.out.println(); } } } 结果: C++输出杨辉三角//单数组动态规划输出杨辉三角,以下截止第31行 #include <iostream> using namespace std; #define MAXH 31 int main() { int i,j; unsigned long num[MAXH]={0}; num[0] = 1; for(i = 0; i < MAXH; i++) { for(j = i; j > 0; j--) { num[j] = num[j] + num[j - 1];//A[i,j]=A[i,j-1]+A[i,j] cout<<num[j]<<" "; } cout<<"1"<<endl; } return 0; } 数组输出杨辉三角/*直角三角形*#include<iostream> using namespace std; int main() { int h,i,j; cout<<"请输入杨辉三角的高度:"<<endl; cin>>h; int a[10][10]; for(i=0;i<10;i++) { a[i][i]=1; a[i][0]=1; } for(i=2;i<10;i++) for(j=1;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<=h;i++) { for(j=0;j<=i;j++) cout<<a[i][j]<<'\\t'; cout<<endl; } return 0; } /*等腰三角形*#include<iostream> using namespace std; int main() { int i,j,h,a[10][10]; cout<<"请输入杨辉三角的高度:"<<endl; cin>>h; for(i=0;i<=h;i++) { for(j=0;j<=i;j++) { if(i==j||j==0) a[i][j]=1; else a[i][j]=a[i-1][j]+a[i-1][j-1]; } } for(i=0;i<=h;i++) { for(j=h;j>=i;j--) cout<<" "; for(j=0;j<=i;j++) { cout<<a[i][j]<<'\\t'; if(i==j) cout<<endl; } } return 0; } 递归方法输出直角杨辉三角#include<iostream> using namespace std; int computeTriangleElement(int level,int index); void yanghuiTriangle(int level); void yanghuiTriangle(int level) { for(int i=1;i<=level;i++) { for(int j=1;j<=i;j++) { cout<<computeTriangleElement(i,j)<<' '; } cout<<endl; } } int computeTriangleElement(int level,int index) { if(index==1||index==level) return 1; return computeTriangleElement(level-1,index-1)+computeTriangleElement(level-1,index); } int main() { int level; cout<<"请输入杨辉三角的高度:"<<endl; cin>>level; yanghuiTriangle(level); return 0; } 队列输出直角杨辉三角#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define ERROR 0 #define OK 1 #define OVERFLOW -1 #define MAX_QUEUE 100 typedef int DataType; typedef struct { DataType elem[MAX_QUEUE]; int front; int rear; }LinkQueue; int InitQueue(LinkQueue *); void EnQueue(LinkQueue *,DataType); void DeQueue(LinkQueue *,DataType *); void GetFront(LinkQueue,DataType *); int QueueEmpty(LinkQueue); void YangHuiTriangle(int ); int main() { int n=1; printf("please enter a number: "); scanf("%d",&n); if(n<=0) { printf("ERROR!\"); exit(0); } YangHuiTriangle(n); return 0; } int InitQueue(LinkQueue *Q) { Q->front=Q->rear=-1; return 1; } void EnQueue(LinkQueue *Q,DataType e) { if((Q->rear+1)%MAX_QUEUE==Q->front) exit(OVERFLOW); else { Q->rear=(Q->rear+1)%MAX_QUEUE; Q->elem[Q->rear]=e; } } void DeQueue(LinkQueue *Q,DataType *e) { if(QueueEmpty(*Q)) { printf("queue is empty\"); exit(0); } else { Q->front=(Q->front+1)%MAX_QUEUE; *e=Q->elem[Q->front]; } } void GetFront(LinkQueue Q,DataType *e) { if(QueueEmpty(Q)) { printf("queue is empty\"); exit(0); } else *e=Q.elem[(Q.front+1)%MAX_QUEUE]; } int QueueEmpty(LinkQueue Q) { if(Q.front==Q.rear) return 1; else return 0; } void YangHuiTriangle(int n) { LinkQueue Q; int i,j,k,t,s,e; InitQueue(&Q); for(i=0;i<n;i++) printf(" "); printf(" 1\"); EnQueue(&Q,1); EnQueue(&Q,1); for(i=1;i<n;i++) { for(k=0;k<n-i;k++) printf(" "); EnQueue(&Q,1); for(j=0;j<i;j++) { DeQueue(&Q,&t); printf(" %3d ",t); GetFront(Q,&s); e=t+s; EnQueue(&Q,e); } EnQueue(&Q,1); DeQueue(&Q,&t); printf(" %d\",t); } } |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。