文章目录
0x00 前言
0x01 百鸡百钱
0x02 借书方案知多少
0x03 持续更新···
0x04 参考文献
0x05 总结
0x00 前言
写这篇《C语言笔记 | 数据结构入门指南》主要是为了帮助更多的编程爱好者打开数据结构的大门,同时也是为了自我编程水平能力的提升。在深奥的数据结构领域中,这篇入门指南就像海上的一叶扁舟。虽是虚无缥缈,但是总比什么都没有要好得多。我将竭尽我所能,简明扼要地解释相关案例中的知识点。其中不乏会有错误,恳请各位老师不吝指正。
0x01 百鸡百钱
0x1 题目描述
我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
0x2 问题分析
关于百鸡百钱的不定方程组:
其中, x 表示鸡翁、 y 表示鸡母、 z 表示鸡雏。在计算机中,我们可以通过使用计算机思维对这类题目计算,而不是数学思维。可以使用穷举的方法将每个结果列举出来,直到计算机找出哪个正确的结果。也就是怎么买可以做到百鸡百钱。
0x3 代码设计
int x, y, z;
代码解析:定义三个变量, x 表示鸡翁、 y 表示鸡母、 z 表示鸡雏。
for(x = 0; x <= 20; x++)
{
for(y = 0; y <= 33; y++)
{
z = 100 - (x + y);
代码解析:这里可以使用三重循环,但是鸡雏可以直接通过 100 减去鸡翁和鸡母的和来确定。减少一个循环可以起到代码优化的效果。第一个循环用来确定鸡翁的数量,第二个循环用来确定鸡母的数量。
if((5 * x + 3 * y + z / 3) == 100)
{
printf("鸡翁:%2d | 鸡母 :%2d | 鸡雏:%2d\n", x, y, z);
}
代码解析: 使用 if 判断语句判断,如果不定方程组的第二个式子的值等于 100 ,那么就执行一次 printf 输出函数记录一次百鸡百钱的值。
0x4 完整代码
#include<stdio.h>
int main()
{
int x, y, z;
for(x = 0; x <= 20; x++)
{
for(y = 0; y <= 33; y++)
{
z = 100 - (x + y);
if((5 * x + 3 * y + z / 3) == 100)
{
printf("鸡翁:%2d | 鸡母 :%2d | 鸡雏:%2d\n", x, y, z);
}
}
}
return 0;
}
0x5 运行效果
鸡翁: 0 | 鸡母 :25 | 鸡雏:75
鸡翁: 3 | 鸡母 :20 | 鸡雏:77
鸡翁: 4 | 鸡母 :18 | 鸡雏:78
鸡翁: 7 | 鸡母 :13 | 鸡雏:80
鸡翁: 8 | 鸡母 :11 | 鸡雏:81
鸡翁:11 | 鸡母 : 6 | 鸡雏:83
鸡翁:12 | 鸡母 : 4 | 鸡雏:84
--------------------------------
Process exited after 0.08475 seconds with return value 0
请按任意键继续. . .
0x02 借书方案知多少
0x1 题目描述
小明有 5 本新书,要借给 A 、 B 、 C 三位小朋友,若每人每次只能借 1 本,则可以有多少种不同的借法?
0x2 问题分析
这题关于排列组合,也就是计算 5 个数中 3 个不同数的所有排列方法,那么可以先进行编号 1~5 表示这五本不同的书,接着定义三个变量 a 、 b 、 c 表示三个小朋友。那么可以使用循环嵌套的方法让每个小朋友进行选书,在 a 和 b之间判断不能选一样的书。接着让 a 和 c 以及 b 和 c 他们之间也不能选择一样的书。
0x3 代码设计
int a, b, c, i = 0;
代码解析:定义一个变量 a 表示小朋友 A 、变量 b 表示小朋友 B 、变量 c 表示 小朋友 C 。定义 i = 0 用来累计有多少种不同的借法。
for(a = 1; a <= 5; a++)
{
for(b = 1; b <= 5; b++)
{
if(a != b)
{
for(c = 1; c <= 5; c++)
{
if(a != c && b != c)
{
i++;
printf("a:%d | b:%d | c:%d\n", a, b, c);
}
}
}
}
}
代码解析:第一层循环用来计算小朋友 A 拿的书,第二层循环计算小朋友 B 拿的书。给出判断条件,如果 a 不等于 b 则执行以下代码,就是判断如果小朋友 A 和小朋友 B 拿了一样的书就是没有意义的,则不执行。接着给第三层循环,用来计算小朋友 C 。判断如果 A 和 C 拿了一样的书或者是 B 和 C 拿了一样的书,那么代码不执行。如果都不是一样的书则会执行 i++ 累加器用来计算有多少种分配的次数,并打印结果显示这次小朋友 A 、 B 、 C 是拿的什么书。
printf("借法:%d", i);
代码解析:使用 printf 函数输出变量 i 累加的值,输出的结果就是借法的次数。
0x4 完整代码
#include<stdio.h>
int main()
{
int a, b, c, i=0;
for(a = 1; a <= 5; a++)
{
for(b = 1; b <= 5; b++)
{
if(a != b)
{
for(c = 1; c <= 5; c++)
{
if(a != c && b != c)
{
i++;
printf("a:%d | b:%d | c:%d\n", a, b, c);
}
}
}
}
}
printf("借法:%d", i);
return 0;
}
0x5 运行效果
a:1 | b:2 | c:3
a:1 | b:2 | c:4
a:1 | b:2 | c:5
a:1 | b:3 | c:2
a:1 | b:3 | c:4
a:1 | b:3 | c:5
a:1 | b:4 | c:2
a:1 | b:4 | c:3
a:1 | b:4 | c:5
a:1 | b:5 | c:2
a:1 | b:5 | c:3
a:1 | b:5 | c:4
a:2 | b:1 | c:3
a:2 | b:1 | c:4
a:2 | b:1 | c:5
a:2 | b:3 | c:1
a:2 | b:3 | c:4
a:2 | b:3 | c:5
a:2 | b:4 | c:1
a:2 | b:4 | c:3
a:2 | b:4 | c:5
a:2 | b:5 | c:1
a:2 | b:5 | c:3
a:2 | b:5 | c:4
a:3 | b:1 | c:2
a:3 | b:1 | c:4
a:3 | b:1 | c:5
a:3 | b:2 | c:1
a:3 | b:2 | c:4
a:3 | b:2 | c:5
a:3 | b:4 | c:1
a:3 | b:4 | c:2
a:3 | b:4 | c:5
a:3 | b:5 | c:1
a:3 | b:5 | c:2
a:3 | b:5 | c:4
a:4 | b:1 | c:2
a:4 | b:1 | c:3
a:4 | b:1 | c:5
a:4 | b:2 | c:1
a:4 | b:2 | c:3
a:4 | b:2 | c:5
a:4 | b:3 | c:1
a:4 | b:3 | c:2
a:4 | b:3 | c:5
a:4 | b:5 | c:1
a:4 | b:5 | c:2
a:4 | b:5 | c:3
a:5 | b:1 | c:2
a:5 | b:1 | c:3
a:5 | b:1 | c:4
a:5 | b:2 | c:1
a:5 | b:2 | c:3
a:5 | b:2 | c:4
a:5 | b:3 | c:1
a:5 | b:3 | c:2
a:5 | b:3 | c:4
a:5 | b:4 | c:1
a:5 | b:4 | c:2
a:5 | b:4 | c:3
借法:60
--------------------------------
Process exited after 0.08041 seconds with return value 0
请按任意键继续. . .
0x03 持续更新···
打鱼还是晒网 |
0x04 参考文献
[1].百度百科. 百鸡百钱[EB/OL]. [2023-05-29]. https://baike.baidu.com/item/%E7%99%BE%E9%B8%A1%E7%99%BE%E9%92%B1.
[2].刘河飞, 闰凯峰. 趣学Python算法100例[M]. ISBN:978-7-111-66598-4. 北京: 机械工业出版社, 2020.9.
0x05 总结
文章内容为学习记录的笔记,由于作者水平有限,文中若有错误与不足欢迎留言,便于及时更正。