杨辉三角与杨氏矩阵的求解
文章目录
一、杨辉三角
1、杨辉三角的概念
杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。
2、杨辉三角形图
2.杨辉三角形图
3、杨辉三角的规律
(1)杨辉三角形上每一行的第一个数和最后一个数都是数字1。
(2)从第二行开始,每个数都等于它上方两数的和。
(3)第n行就会n个数字。
4、杨辉三角的代码实现
(1)将杨辉三角形上每一行的第一个数和最后一个数都赋值为1
for (i = 0; i < line; i++)
{
//1.将每一行的第一个和最后一个赋值为1
arr[i][0] = 1;
arr[i][i] = 1;
}
(2)从第二行开始,每个数都等于它上方两数的和。求出它上方两数的和并且赋值给它。arr[i][j]上方两数字的坐标分别是arr[i-1][j-1]和arr[i-1][j]。
for (i = 2; i < line; i++)
{
int j = 0;
for (j = 1; j < i; j++)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
(3)完整代码如下
//杨辉三角
int main()
{
int arr[100][100] = {0};
int line = 0;
scanf("%d",&line);
int i = 0;
for (i = 0; i < line; i++)
{
//1.将每一行的第一个和最后一个赋值为1
arr[i][0] = 1;
arr[i][i] = 1;
}
//从第二行开始,上面两个数的和等于下面这个数
for (i = 2; i < line; i++)
{
int j = 0;
for (j = 1; j < i; j++)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
//打印输出
int j = 0;
for (i = 0; i < line; i++)
{
int j = 0;
for (j = 0; j < line - i - 1; j++)
{
printf(" ");//打印前面的空格
}
for (j = 0; j <= i; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
5、杨辉三角的代码实现效果图
二、杨氏矩阵查找问题
1、杨氏矩阵的概念
杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。杨氏矩阵是剑桥大学大学数学家阿尔弗雷德·扬在1900年提出。有一个二维数组.,数组的每行从左到右是递增的,每列从上到下是递增的, 在这样的数组中查找一个数字是否存在。
题目要求 时间复杂度小于O(N)。
2、杨氏矩阵规律
(1)杨氏矩阵每行,每列的数都是依次递增的
(2)每一行的最后一个数是最大的
3、杨氏矩阵的求解思路
我们可以把我们需要找的数与每一行最后一个数来进行比较:
如果我们要找的数(k)>最后一个数字,我们就从下一行开始寻找;
如果我们要找的数(k)<最后一个数字,我们就从下一列开始寻找;
如果我们要找的数(k)==最后一个数字,我们就找到那个数字了。
4、杨氏矩阵的代码实现
//杨氏矩阵查找问题
void find(int arr[3][4], int row, int col, int k)
{
int x = 0;
int y = col-1;
int flag = 0;
while (x <= row && y >= 0)//注意这里的x小于等于行数
{
if (arr[x][y] > k)
{
y--;//这行最后一个数大于我们要查找的数,切换到下一列
}
else if (arr[x][y] < k)
{
x++;//这行最后一个数小于我们要查找的数,切换到下一行
}
else if(arr[x][y]==k)
{
printf("找到了,下标是%d行,%d列\n",x,y);
flag = 1;
break;
}
}
if(flag==0)
printf("找不到");
}
int main()
{
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
int key = 10;
int x = 3;
int y = 4;//坐标
find(arr, x, y, key);
return 0;
}