【C语言练习】杨氏矩阵、杨辉三角
创始人
2024-05-23 00:53:09
0

在这里插入图片描述
在这里插入图片描述

目录

  • 一:杨氏矩阵
    • 🐻何为杨氏矩阵?
    • 🐻题目描述:
    • 🐻思路一:
    • 🐻思路二:
  • 二:杨辉三角
    • 🐻何为杨辉三角?
    • 🐻题目描述:
    • 🐻解题思路:

一:杨氏矩阵

🐻何为杨氏矩阵?

杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。杨氏矩阵是剑桥大学大学数学家阿尔弗雷德·扬在1900年提出。然后在1903年,它被用于格奥尔格·弗罗贝纽斯的对称群研究中。它的理论得益于许多数学家的贡献得到进一步发展,包括珀西·麦克马洪,W.V.D.霍奇,G.deB.罗宾逊,吉安·卡咯罗塔,阿兰拉斯克斯,马塞尔·保罗斯库森博格和理查德·P·史丹利。
杨氏矩阵最显著的特点是: 矩阵的每一行从左到右递增的,矩阵的每一列从上到下递增的。

在这里插入图片描述
 如上图就是一个杨氏矩阵。

🐻题目描述:

编写程序在杨氏矩阵中查找某一数字是否存在若存在打印出坐标,若不存在,打印 “没找到”要求:时间复杂度小于O(N)


🐻思路一:

 关于杨氏矩阵我们很容易想到可以用一个二维数组来表示,现在问题就变成了在一个二维数组中查找一个数字,我们很容易想到的就是遍历整个二维数组,这种方法当然没问题,但是但是它的时间复杂度是O(N^2),不满足题目要求,因此需要换一种思路。

🐻思路二:

 我们可以从杨氏矩阵的特点入手,来寻求解题方法。杨氏矩阵最显著的特点是: 矩阵的每一行从左到右递增的,矩阵的每一列从上到下递增的。因此我们不难发现:矩阵右上角的元素是第一行所有元素中最大的,同时也是最后一列所有元素中最小的。发现了这个特点以后,我们就可以让待查找的数字,与矩阵右上角的数字进行比较,如果待查找的数字比矩阵右上角的数字大,那待查找的数字就不可能在第一行,因为矩阵右上角的数字已经是第一行中最大的那个了,待查找的数字比矩阵右上角的数字还要大,此时就可以排除掉第一行的所有元素,在剩下的矩阵中查找。当待查找的数字比矩阵右上角的数字小的时候,那待查找的数字就不可能在矩阵的最后一列,因为矩阵右上角的数字已经是最后一列中最小的那个,待查找的数字比矩阵右上角的数字还要小,此时就可以排除掉矩阵最后一列的所有元素,在剩下的矩阵中查找。就一直这样让待查找的数字与矩阵右上角的数字作比较,最终就能比较出结果。分析的差不多了,接下来上代码。

void find_k(int arr[3][3], int r, int l, int k)
{//右上角元素的坐标(x,y)int x = 0;int y = l - 1;//定义一个标志变量flagint flag = 0;//找到时把flag置为1//最终通过看flag的值来看是否找到while (x < r && y >= 0){if (arr[x][y] > k)//待查找的元素比右上角的元素小//此时就可以排除掉最右边的一整列{y--;}else if (arr[x][y] < k)//待查找的元素比右上角的元素大//此时就可以排除掉第一行所有元素{x++;}else//找到了{flag = 1;printf("找到了,坐标是:%d %d\n", x, y);break;//找到之后就要跳出循环}}if (flag == 0){printf("没找到");}
}int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int r = sizeof(arr)/sizeof(arr[0]);//r表示行int l = sizeof(arr[0])/4;//l表示列int k = 0;//k表示待查找的数字printf("请输入要查找的数字:");scanf("%d", &k);find_k(arr, r, l, k);return 0;
}

 上面的代码已经满足题目要求,但是我们发现,查找结果是直接在find_k函数中打印出来的,如果我们想在主函数中打印查找结果该怎么办呢?判断找没找到很容易实现,如果找到了,就让find_k函数返回 111 ,如果没有找到,就让find_k函数返回 000 ,在主函数中用一个变量 ret 来接收函数的返回值,最终判断 ret 的大小就知道找没找到了。问题的难点在于:如果找到了,如何把坐标返回到主函数中,坐标是由两个数字组成的,因此无法直接利用 return 返回,还有什么办法呢?我们可以通过传地址来解决这个问题,观察find_k函数的参数,可以发现 rl 很适合来做这个差事,把rl 的地址传过去,如果找到了就把坐标存到rl里面去。分析的差不多了,接下来上代码:

int find_k(int arr[3][3], int* pr, int* pl, int k)
{//右上角元素的坐标(x,y)int x = 0;int y = *pl - 1;while (x < *pr && y >= 0){if (arr[x][y] > k)//待查找的元素比右上角的元素小//此时就可以排除掉最右边的一整列{y--;}else if (arr[x][y] < k)//待查找的元素比右上角的元素大//此时就可以排除掉第一行所有元素{x++;}else//找到了{*pr = x;*pl = y;return 1;//找到之后就返回1}}return 0;
}int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int r = sizeof(arr) / sizeof(arr[0]);//r表示行数int l = sizeof(arr[0]) / 4;//l表示列数int k = 0;//k表示待查找的数字printf("请输入要查找的数字:");scanf("%d", &k);int ret = find_k(arr, &r, &l, k);if (ret == 0){printf("没找到\n");}else{printf("找到了,坐标是:%d %d\n", r, l);}return 0;
}

 本题到这里就结束了。请看下一题,剧透以下:下个题也性

二:杨辉三角

🐻何为杨辉三角?

杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合

在这里插入图片描述
上图就是一个杨辉三角

🐻题目描述:

在屏幕上打印出杨辉三角


🐻解题思路:

 首先应想到的是,利用二维数组来存储杨辉三角每一行的数值。接下来就该观察这些数值的特点了,不难发现二维数组的第 000 列主对角线上的元素全是 111,对于这些位置上的元素我们可以直接把其初始化为 111 ,剩下位置上的元素是需要通过计算得到的,假设当前位置的下标是 i ,j那么arr[i][j]的值就是其正上方和左上方的值的和,也就是公式:arr[i][j]=arr[i-1][j-1]+arr[i-1][j] 。其实从二维数组的第二行开始,主对角线上的元素也可以通过前面的公式计算得出,但此时必须保证公式中 arr[i-1][j] 的值是 000 ,如果当前的 arr[i][j] 是主对角线上的元素,那么 arr[i-1][j] 就不是杨辉三角中的一份子,但是为了计算出arr[i][j],我们必须保证arr[i-1][j]的值是 000 ,这一点也很容易实现,在定义二维数组的同时,我们只初始化数组的第一个元素,把它初始化为 111 ,此时数组中剩下的元素就会被默认初始化为 000 ,这样问题就得以解决了。二维数组中的数值处理完了,接下来就该把这个二维数组打印出来了,杨辉三角只占用了二维数组的左下角这一片区域,所以只需要打印出左下角这片区域的内容即可,这片区域的坐标特点是:列标小于等于行标。分析的差不多了,接下来上代码:

int main()
{int arr[10][10] = {1};//直接把第一个元素初始化成1,也就是杨辉三角的第一行int i = 0;for (i = 1; i < 10; i++)//接下来从第二行开始{arr[i][0] = 1;//每行的第一列都没有区别,直接给1,保证不会越界int j = 0;for (j = 1; j <= i; j++)//从第二列开始{arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];}}//打印for (i = 0; i < 10; i++){int j = 0;for (j = 0; j <=i; j++){//只需要打印左下区的元素//左下区元素小标的特点是:列标小于等于行标printf("%d ", arr[i][j]);}//一行打印结束换行printf("\n");}return 0;
}

🎶结语:
 今天分享了两道性题目,杨氏矩阵杨辉三角,这两道题都是已二维数组为基础,再结合各自的特点最终完成题解,由此可见拿到题目最主要的就是发现题目的特点,结合特点去解题往往会达到事半功倍的效果。
 今天的分享到这里就结束啦,以上的内容如果对你有帮助的话,可以动动小手点赞、评论、收藏,你的支持就是我前进路上最大的动力!


在这里插入图片描述

相关内容

热门资讯

非安卓10系统手机,探索非安卓... 你有没有想过,为什么有些人会选择非安卓10系统的手机呢?是不是觉得这有点奇怪?别急,今天就来带你一探...
手机图标制作安卓系统,手机图标... 你有没有想过,那些在手机屏幕上跳动的图标,其实都是精心设计出来的艺术品呢?没错,今天就要带你一探究竟...
安卓系统和鸿蒙系统谁大,谁才是... 你有没有想过,手机里的操作系统就像是一场无声的较量?今天,咱们就来聊聊这个话题:安卓系统和鸿蒙系统,...
bj40安卓系统,功能解析与使... 你有没有发现,最近你的BJ40越野车变得聪明多了?没错,它升级了安卓系统,简直就像给它装上了个智能大...
安卓系统硬件核心板,揭秘智能设... 你有没有想过,手机里的安卓系统其实就像是一个庞大的城市,而硬件核心板就是这座城市的核心区域?今天,就...
王者荣耀安卓系统转区ios系统... 你有没有想过,把你的王者荣耀账号从安卓系统转到iOS系统呢?这可不是一件小事,里面可是有大学问的哦!...
安卓系统的音游,节奏与音乐的完... 你有没有发现,手机里的游戏越来越好玩了?尤其是那些音游,简直让人停不下来!今天,就让我带你深入了解一...
安卓系统取消下方按键,探索全新... 你知道吗?最近安卓系统来了一次大变动,那就是取消了下方按键!这可真是让人眼前一亮,让我们一起来看看这...
安卓系统显示原理设置,从像素到... 你有没有发现,你的安卓手机屏幕上那些花花绿绿的图标和文字,其实背后有着一套神奇而又复杂的显示原理呢?...
平板安卓4.0系统下载,平板下... 你有没有想过,拥有一台运行着最新安卓4.0系统的平板电脑,那感觉简直就像拥有了未来的钥匙?想象流畅的...
安卓原生12系统下载,原生系统... 你有没有听说?安卓原生12系统终于来了!这款全新的操作系统,不仅带来了全新的视觉体验,还有一堆实用的...
安卓怎么下泼辣系统,安卓设备轻... 你有没有想过给你的安卓手机来个“大变身”?想象你的手机瞬间变成了一个泼辣的“女侠”,不仅个性十足,而...
安卓版小米系统下载,畅享智能生... 你有没有发现,最近手机圈里又掀起了一股热潮?没错,就是安卓版小米系统的下载。这款系统自从推出以来,就...
提取安卓系统自带软件,探索安卓... 你有没有想过,你的安卓手机里那些看似不起眼的自带软件,其实都是隐藏的宝藏呢?今天,就让我带你一探究竟...
安卓系统投屏到鸿蒙系统,鸿蒙系... 亲爱的读者们,你是否有过这样的体验:手里拿着安卓手机,却想在大屏幕的鸿蒙系统设备上展示内容?别急,今...
sony 电视安卓8.0系统,... 亲爱的读者们,你是否也和我一样,对科技产品有着浓厚的兴趣呢?今天,我要和你聊聊一个让我眼前一亮的话题...
安卓 替换系统下载,探索安卓系... 你有没有想过,你的安卓手机其实可以换换口味呢?没错,就是那个一直默默陪伴你的系统,今天就来带你一起探...
安卓系统证书信任,安卓系统证书... 你有没有遇到过这种情况?手机里突然弹出一个提示,告诉你某个应用需要获取系统证书信任,然后你一脸懵逼,...
安卓系统应用数据目录,揭秘系统... 你有没有想过,你的安卓手机里那些应用,它们的数据都藏在哪个角落呢?今天,就让我带你一探究竟,揭开安卓...
kindle 安卓 系统 刷机... 亲爱的读者们,你是不是也和我一样,对电子阅读设备情有独钟?尤其是那款小巧便携的Kindle,简直是阅...