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	}

在这里插入图片描述

利用指针返回坐标

完结

求赞~~~

#include <stdio.h> #define MaxSize 100 typedef struct { char data[MaxSize]; int length; //串长 } SqString; // 顺序串基本运算的算法 void StrAssign(SqString &s, char cstr[]) //字符串常量赋给串s { int i; for (i = 0; cstr[i] != '\0'; i++) s.data[i] = cstr[i]; s.length = i; } void DestroyStr(SqString &s) { } void StrCopy(SqString &s, SqString t) //串复制 { int i; for (i = 0; i < t.length; i++) s.data[i] = t.data[i]; s.length = t.length; } bool StrEqual(SqString s, SqString t) //判串相等 { bool same = true; int i; if (s.length != t.length) //长度不相等时返回0 same = false; else for (i = 0; i < s.length; i++) if (s.data[i] != t.data[i]) //有一个对应字符不相同时返回0 { same = false; break; } return same; } int StrLength(SqString s) //求串长 { return s.length; } SqString Concat(SqString s, SqString t) //串连接 { SqString str; int i; str.length = s.length + t.length; for (i = 0; i < s.length; i++) //将s.data[0..s.length-1]复制到str str.data[i] = s.data[i]; for (i = 0; i < t.length; i++) //将t.data[0..t.length-1]复制到str str.data[s.length + i] = t.data[i]; return str; } SqString SubStr(SqString s, int i, int j) //求子串 { SqString str; int k; str.length = 0; if (i <= 0 || i > s.length || j < 0 || i + j - 1 > s.length) return str; //参数不正确时返回空串 for (k = i - 1; k < i + j - 1; k++) //将s.data[i..i+j]复制到str str.data[k - i + 1] = s.data[k]; str.length = j; return str; } SqString InsStr(SqString s1, int i, SqString s2) //插入串 { int j; SqString str; str.length = 0; if (i <= 0 || i > s1.length + 1) //参数不正确时返回空串 return str; for (j = 0; j < i - 1; j++) //将s1.data[0..i-2]复制到str str.data[j] = s1.data[j]; for (j = 0; j < s2.length; j++) //将s2.data[0..s2.length-1]复制到str str.data[i + j - 1] = s2.data[j]; for (j = i - 1; j < s1.length; j++) //将s1.data[i-1..s1.length-1]复制到str str.data[s2.length + j] = s1.data[j]; str.length = s1.length + s2.length; return str; } SqString DelStr(SqString s, int i, int j) //串删去 { int k; SqString str; str.length = 0; if (i <= 0 || i > s.length || i + j > s.length + 1) //参数不正确时返回空串 return str; for (k = 0; k < i - 1; k++) //将s.data[0..i-2]复制到str str.data[k] = s.data[k]; for (k = i + j - 1; k < s.length; k++) //将s.data[i+j-1..s.length-1]复制到str str.data[k - j] = s.data[k]; str.length = s.length - j; return str; } SqString RepStr(SqString s, int i, int j, SqString t) //子串替换 { int k; SqString str; str.length = 0; if (i <= 0 || i > s.length || i + j - 1 > s.length) //参数不正确时返回空串 return str; for (k = 0; k < i - 1; k++) //将s.data[0..i-2]复制到str str.data[k] = s.data[k]; for (k = 0; k < t.length; k++) //将t.data[0..t.length-1]复制到str str.data[i + k - 1] = t.data[k]; for (k = i + j - 1; k < s.length; k++) //将s.data[i+j-1..s.length-1]复制到str str.data[t.length + k - j] = s.data[k]; str.length = s.length - j + t.length; return str; } void DispStr(SqString s) //输出串s { int i; if (s.length > 0) { for (i = 0; i < s.length; i++) printf("%c", s.data[i]); printf("\n"); } } typedef struct node { SqString Husband; SqString Wife; struct node *lchild; //指向左孩子节点 struct node *rchild; //指向右孩子节点 } BTNode; // 查找某人(参数为父亲姓名或者母亲姓名)的孩子们 void findChildren55(BTNode *root, SqString name55) { if (root == NULL) return; if (StrEqual(root->Husband, name55) || StrEqual(root->Wife, name55)) { if (root->lchild != NULL) { printf("55: 孩子: "); DispStr(root->lchild->Husband); } if (root->rchild != NULL) { printf("55: 孩子: "); DispStr(root->rchild->Husband); } return; } findChildren55(root->lchild, name55); findChildren55(root->rchild, name55); } // 查找某人的所有祖先 void findAncestors55(BTNode *root, SqString name55, BTNode *ancestors[], int &count) { if (root == NULL) return; if ((root->lchild != NULL && StrEqual(root->lchild->Husband, name55)) || (root->rchild != NULL && StrEqual(root->rchild->Husband, name55))) { ancestors[count++] = root; return; } int tempCount = count; findAncestors55(root->lchild, name55, ancestors, count); if (tempCount != count) { ancestors[count++] = root; return; } findAncestors55(root->rchild, name55, ancestors, count); if (tempCount != count) { ancestors[count++] = root; } } // 查找某人同代的所有兄弟姐妹 void findSiblings55(BTNode *root, SqString name55) { if (root == NULL) return; if (root->lchild != NULL && StrEqual(root->lchild->Husband, name55)) { if (root->rchild != NULL) { printf("55: 兄弟姐妹: "); DispStr(root->rchild->Husband); } return; } if (root->rchild != NULL && StrEqual(root->rchild->Husband, name55)) { if (root->lchild != NULL) { printf("55: 兄弟姐妹: "); DispStr(root->lchild->Husband); } return; } findSiblings55(root->lchild, name55); findSiblings55(root->rchild, name55); } // 给某人添加孩子 void addChild55(BTNode *root, SqString parentName55, SqString childName55, SqString childWife55) { if (root == NULL) return; if (StrEqual(root->Husband, parentName55)) { if (root->lchild == NULL) { root->lchild = new BTNode; StrCopy(root->lchild->Husband, childName55); StrCopy(root->lchild->Wife, childWife55); root->lchild->lchild = NULL; root->lchild->rchild = NULL; printf("55: 成功添加孩子: "); DispStr(childName55); } else if (root->rchild == NULL) { root->rchild = new BTNode; StrCopy(root->rchild->Husband, childName55); StrCopy(root->rchild->Wife, childWife55); root->rchild->lchild = NULL; root->rchild->rchild = NULL; printf("55: 成功添加孩子: "); DispStr(childName55); } else { printf("55: 该家庭已有两个孩子,无法添加。\n"); } return; } addChild55(root->lchild, parentName55, childName55, childWife55); addChild55(root->rchild, parentName55, childName55, childWife55); } // 某单身人士结婚后添加妻子姓名 void addWife55(BTNode *root, SqString husbandName55, SqString wifeName55) { if (root == NULL) return; if (StrEqual(root->Husband, husbandName55)) { if (root->Wife.length == 0) { StrCopy(root->Wife, wifeName55); printf("55: 成功添加妻子: "); DispStr(wifeName55); } else { printf("55: 该男士已有妻子,无法添加。\n"); } return; } addWife55(root->lchild, husbandName55, wifeName55); addWife55(root->rchild, husbandName55, wifeName55); } // 从输入字符串构建二叉树 BTNode* buildTree(SqString str) { if (str.length == 0) return NULL; int i = 0; while (i < str.length && str.data[i] != '(') i++; SqString couple = SubStr(str, 1, i); int j = 0; while (j < couple.length && couple.data[j] != '/') j++; BTNode *node = new BTNode; StrCopy(node->Husband, SubStr(couple, 1, j)); StrCopy(node->Wife, SubStr(couple, j + 1, couple.length - j - 1)); if (i == str.length) { node->lchild = NULL; node->rchild = NULL; } else { int leftStart = i + 1; int leftEnd = leftStart; int count = 0; while (leftEnd < str.length) { if (str.data[leftEnd] == '(') count++; if (str.data[leftEnd] == ')') count--; if (count == 0 && str.data[leftEnd] == ',') break; leftEnd++; } node->lchild = buildTree(SubStr(str, leftStart, leftEnd - leftStart)); node->rchild = buildTree(SubStr(str, leftEnd + 1, str.length - leftEnd - 2)); } return node; } int main() { char input[] = "苏序/史氏(苏涣/杨氏(苏不欺/蒲氏,苏不疑),苏洵/程氏(苏轼/王弗,苏辙/史氏))"; SqString inputStr; StrAssign(inputStr, input); BTNode *root = buildTree(inputStr); // 测试查找孩子 SqString searchName; StrAssign(searchName, "苏涣"); findChildren55(root, searchName); // 测试查找祖先 BTNode *ancestors[100]; int count = 0; StrAssign(searchName, "苏轼"); findAncestors55(root, searchName, ancestors, count); printf("55: 祖先: \n"); for (int i = count - 1; i >= 0; i--) { DispStr(ancestors[i]->Husband); } // 测试查找兄弟姐妹 StrAssign(searchName, "苏辙"); findSiblings55(root, searchName); // 测试添加孩子 SqString childName; SqString childWife; StrAssign(searchName, "苏轼"); StrAssign(childName, "苏迈"); StrAssign(childWife, "某氏"); addChild55(root, searchName, childName, childWife); // 测试添加妻子 SqString husbandName; SqString wifeName; StrAssign(husbandName, "苏不疑"); StrAssign(wifeName, "新妻子"); addWife55(root, husbandName, wifeName); return 0; }
最新发布
11-16
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Optimistic _ chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值