c语言中“杨氏”兄弟

1.杨辉三角

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

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

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

在这里插入图片描述

代码思路:

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

代码:

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较小,则向左移动,和左边一行的元素进行比较。最差的情况是从左上角一直比到右下角。

#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");
    }
}

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

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	}

在这里插入图片描述

利用指针返回坐标

完结

求赞~~~

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值