排列
前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、每个数等于它上方两数之和。
3、第n行的数字有n项。
4、第n行数字和为2^(n-1)。(2的(n-1)次方)
6、每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。(公式见右图)
7、第n行的m个数可表示为C(n-1,m-1)(n-1下标,m-1上标),即为从n-1个不同
组合数计算方法:C(n,m)=n!/[m!(n-m)!]
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
|
历史
杨辉
,字谦光,
南宋
时期
杭州
人。在他1261年所著的《
详解九章算法
》一书中,辑录了如上所示的三角形数表,称之为“开方作法本源”图,并说明此表引自11世纪前半
贾宪
的《释锁算术》,并绘画了“古法七乘方图”。故此,杨辉三角又被称为“贾宪三角”。
布莱士·帕斯卡
的著作Traité du triangle arithmétique(1655年)介绍了这个三角形。帕斯卡搜集了几个关于它的结果,并以此解决一些
概率论
上的问题,影响面广泛,Pierre Raymond de Montmort(
1708年
)和
亚伯拉罕·棣·美弗
(1730年)都用帕斯卡来称呼这个三角形。
近年来国外也逐渐承认这项成果属于中国,所以有些书上称这是“中国三角形”(Chinese triangle)
历史上曾经独立绘制过这种图表的数学家
·贾宪 中国北宋 11世纪 《释锁算术》
·阿尔·卡西 阿拉伯 1427《算术的钥匙》
·施蒂费尔 德国 1544《综合算术》二项式展开式系数
·薛贝尔 法国 1545
·B·帕斯卡 法国 1654《论算术三角形》
其实,中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而杨辉三角的发现就是十分精彩的一页。
应用
例如,在杨辉三角中,第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);
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语言
直角三角形杨辉三角
#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)
只有2出现刚好一次。
6,20,70等出现三次。
出现两次和四次的数很多。
还未能找到出现刚好五次的数。
120,210,1540等出现刚好六次。(OEIS:A098565)
因为丢番图方程:
其解答,是
其中Fn表示第n个斐波那契数(F1 = F2 = 1)。
一道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 ' ';
} else {
echo $a[$i][$j] = $a[$i-1][$j-1] + $a[$i-1][$j];
echo ' ';
}
}
echo '<br />';
}
?>