首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >c语言中“杨氏”兄弟

c语言中“杨氏”兄弟

作者头像
optimistic_chen
发布2026-01-14 19:57:45
发布2026-01-14 19:57:45
2380
举报

1.杨辉三角

题目:杨辉三角的前n行 本质:是二项式(a+b)的n次方展开后各项的系数排成的三角形 与二项式定理的关系:杨辉三角的第n行就是二项式展开式的系数列。

性质: 对称性:杨辉三角中的数字左、右对称,对称轴是杨辉三角形底边上的“高”。

结构特征:杨辉三角除斜边上1以外的各数,都等于它“肩上”的两数之和。

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

代码思路:

1.定义一个二维数组,初始化为0

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

2.由结构特征知:斜边为1 所以当i == j或j==0时为1(i为行 ,j为列)

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

3.循环处理“肩上”两数之和 从第3行第2列开始,当前数=上一行的数+上一行前面的数。

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

4.每行之前加不等的空格,使其居中对齐。

代码:

代码语言:javascript
复制
void YangHui(int arr[][9], int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < i+1; j++)//这里是控制杨辉三角每一行有几列!!!
		{
			if (i == j || j == 0)
			{
				arr[i][j] = 1;
			}

			else{
				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
			}
		}
	}
}
void print(int arr[][9], int n)
{
      for(int i = 0; i < n; i++)
      {
		  for (int k = 0; k < 26 - 6*i/2; k++)//因为宽度为6
		  {
			  printf(" ");
		  }
		for (int j = 0; j <= i; j++)
		{
			printf("%6d", arr[i][j]);

		}
		printf("\n");
	}
}
int main()
{
	int arr[9][9] = {0};

	YangHui(arr,9);
    print(arr,9);
}

运行结果:

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

2.杨氏矩阵

题目:如果一个矩阵的每一行从左至右依次递增,每一列从上到下依次递增,则成这样的矩阵为杨氏矩阵。在杨氏矩阵中查找一个数。 本质:我们知道,杨氏矩阵中最小的元素为左上角元素,最大的元素为右下角元素。 图例:

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

代码思路:

1.先和矩阵右上角的元素进行比较,如果要查找的元素key较大,则向下移动和下面一行的元素进行比较;如果要查找的元素key较小,则向左移动,和左边一行的元素进行比较。最差的情况是从左上角一直比到右下角。

代码语言:javascript
复制
#include<stdio.h>
int FindNum(int arr[][4], int x, int y, int k)
{
	int i = 0;
	int j = y - 1;
	//判断i和j是合法的
	while (k!=arr[i][j]&&i<x&&y>=0)
	{
		if (arr[i][j] < k)
		{
			i++;
		}
		else if (arr[i][j] > k)
		{
			y--;
		}
		else {
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[][3] = { 1,2,3,4,5,6,7,8,9 };
	int ret = FindNum(arr, 3, 3, 5);
	if (ret == 1)
	{
		printf("找到了\n");
	}
	else
	{
	     printf("找不到\n");
    }
}

这个方法虽然可以实现我们的目标,但是不能准确告诉我们被查找数字的坐标,(因为函数返回值只能返回一个值)我们或许可以优化一下它。

代码语言:javascript
复制
int FidNum(int arr[3][3], int k, int *px, int *py)
25	{
26		int x = 0;
27		int y = *py - 1;
28		while (x <= *px && y >= 0) {
29			if (arr[x][y] > k)
30			{
31				y--;
32			}
33			else if (arr[x][y] < k)
34			{
35				x++;
36			}
37			else
38			{
39				*px = x;
40				*py = y;
41				return 1;
42			}
43		}
44		return 0;
45	}
46	int main()
47	{
48		int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9}};
49		int k = 7;
50		int x = 3;
51		int y = 3;
52		//返回型参数
53		int ret = FidNum(arr, k, &x, &y);
54		if (ret == 1)
55		{
56			printf("找到了\n");
57			printf("%d %d", x, y);
58		}
59		else
60		{
61			printf("找不到\n");
62		}
63		return 0;
64	}

利用指针返回坐标

完结

求赞~~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 1.杨辉三角
  • 2.杨氏矩阵
  • 完结
    • 求赞~~~
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档