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 }
利用指针返回坐标