杨辉三角

 
杨辉三角
杨辉三角
杨辉 三角形 ,又称贾宪三角形,帕斯卡三角形,是 二项式系数 在三角形中的一种几何排列。

排列

前10行:









1

















1

1















1

2

1













1

3

3

1











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
第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
第13行:
1 12 66 220 495 792 924 792 495 220 66 12 1

性质

前提:端点的数为1.
1、每个数等于它上方两数之和。
2、每行 数字 左右对称,由1开始逐渐变大。
3、第n行的数字有n项。
4、第n行数字和为2^(n-1)。2的(n-1)次方
5、第n行的第m个数和第n-m+1个数相等,即C(n-1,m-1)=C(n-1,n-m),这是 组合数 性质
性质6的公式表述

性质6的公式表述

之一
6、每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。(公式见右图)
7、第n行的m个数可表示为C(n-1,m-1)(n-1下标,m-1上标),即为从n-1个不同
杨辉三角的组合数表示

杨辉三角的组合数表示

元素中取m-1个元素的组合数。(见右图)
组合数计算方法:C(n,m)=n!/[m!(n-m)!]
8、(a+b)^n的展开式中的各项 系数 依次对应杨辉三角的第(n+1)行中的每一项。[1]
9、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第4n+1个 斐波那契数 ;将第2n行第2个数(n>1),跟第2n-1行第4个数、第2n-2行第6个数……这些数之和是第4n-2个斐波那契数。
10、将各行数字相排列,可得11的N次方:1=11º 11=11¹ 121=11³
注:15101051≠11的5次方 ,应为:

1







5






1
0






1
0







5







1
+







1
6
1
0
5
1

历史

北宋人 贾宪 约1050年首先使用“ 贾宪三角 ”进行高次 开方 运算。
杨辉 ,字谦光, 南宋 时期 杭州 人。在他1261年所著的《 详解九章算法 》一书中,辑录了如上所示的三角形数表,称之为“开方作法本源”图,并说明此表引自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《论算术三角形》
其实,中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而杨辉三角的发现就是十分精彩的一页。

应用

性质6和性质7是杨辉三角的基本性质,是研究杨辉三角其他规律的基础。
杨辉三角的图算

杨辉三角的图算

与杨辉三角联系最紧密的是二项式乘方展开式的系数规律,即 二项式定理
例如,在杨辉三角中,第3行的第三个数恰好对应着两数和的平方的展开式的每一项的系数,
即(a+b)^2;=a^2+2ab+b^2
第4行的四个数恰好依次对应两数和的立方的展开式的每一项的系数
即(a+b)^3=a^3+3a^2b+3ab^2+b^3
以此类推。
又因为性质6:第n行的m个数可表示为C(n,m-1),即为从n个不同元素中取m-1个元素的 组合数 。因此可得出二项式定理的公式为:(a+b)^n=C(n,0)a^n*b^0+C(n,1)a^(n-1)*b^1+...+C(n,r)a^(n-r)*b^r...+C(n,n)a^0*b^n
因此,二项式定理与杨辉三角形是一对天然的数形趣遇,它把 数形结合 带进了 计算数学 。求二项式展开式系数的问题,实际上是一种组合数的计算问题。用系数 通项公式 来计算,称为“式算”;用杨辉三角形来计算,称作“图算”。

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++)
{
string str = "";
  str = str.PadLeft(value - i);
  Console.Write(str);
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);
Console.Readkey();
}
}

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("\n");
}
}
使用 数组 打印金字塔型杨辉三角
#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("\n");
}
}
}
不用数组输出金字塔形杨辉三角
#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("\n");
}
}
注解:
在打印杨辉三角时通常用到杨辉三角的两个性质。
第一个就是杨辉三角中除了最外层(不包括杨辉三角底边)的数为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!\n");
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('\n',out);
}
fclose(out);
}
二维 数组输出前十行:
#include <stdio.h>
void 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("\n");
}
printf("\n");
return 0;
}
菱形杨辉三角
main()
{
int i,j;
int a[6][6];//该程序输出为6层,可根据需要更改数组大小
clrscr();
printf("\n\n\n");
for(i=0;i<6;i++)
for(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];
}
for(i=0;i<6;i++)
{
for(j=0;j<=6-i;j++)
printf("%2c",' ');
for(j=0;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
for(i=4;i>=0;i--)
{
for(j=0;j<=6-i;j++)
printf("%2c",' ');
for(j=0;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
getch();
}
运行结果:

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
Print
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是第一个出现八次的数。[2]
一道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\n",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!\n");
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\n");
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\n");
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\n");
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\n",t);
}
}
SQL输出
--返回某一数的阶乘值
create function Ji (@count int) returns int
as
begin
declare @u int,@index int
set @u = 1 --初使值为 1
set @index = 1
while(@index <= @count)
begin
set @u = @u * @index
set @index = @index + 1
end
return (@u)
end
create function Va(@num int,@count int) returns int
as
begin
declare @up int,@L1 int,@R1 int,@I int
set @up = dbo.Ji(@count)
set @L1 = dbo.Ji(@num)
set @R1 = dbo.Ji(@count - @num)
set @I = @up/(@L1 * @R1)
return (@I)
end
create function PrintRow(@num int) returns nvarchar(100)
as
begin
declare @i int
declare @str nvarchar(100)
set @str = '';
set @i = 1
while (@i < @num)
begin
set @str = @str + replace(str(dbo .Va(@i,@num)),' ','') + ' ,'
set @i = @i + 1
end
return (@str)
end
create proc PrintJiCeng(@num int)
as
begin
declare @i int
set @i = 1
while(@i <= @num )
begin
if (@i = 0 )
print 1 + ','
else if (@i = 1)
print '1,1,'
else
print '1,' + dbo.PrintRow(@i) + '1,'
set @i = @i + 1
end
end
--计算 10 以内的扬辉三角
exec PrintJiCeng 10

PHP输出

<?php
$a[1][1] = 1;
  
$row = 20; //所要输出的行号
  
for ($i = 1; $i < $row; $i++) {
for ($j = 1; $j <= $i; $j++) {
if($j==1 or $i==$j){
echo $a[$i][$j] = 1;
echo '&nbsp';
} else {
echo $a[$i][$j] = $a[$i-1][$j-1] + $a[$i-1][$j];
echo '&nbsp';
}
}
echo '<br />';
  
}
?>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值