当前课程知识点:C语言程序设计(上) > 循环结构的程序设计(二) > 4.7 循环的综合应用 > 4.7.2 循环综合应用——穷举算法
我们大家再看一道题
鸡兔同笼
著名的一个经典的题目
这说什么呢
有多少个脑袋
多少只脚
然后呢说
鸡有多少只
兔有多少只呢
我们用数学的方法解决这道问题
很简单
建立一个方程
然后建立一个方程求解这个方程
得到了
那计算机怎么做这件事呢
计算机不会去建这样的方程
要建是人建的
人再告诉它怎么算
怎么解
那是你的过程
而计算机的过程
你可以用一个最简单的
穷举
然后呢
假定鸡和兔都是极端的情况
匹配
假如 鸡一只都没有
兔从
1到35
假如兔一只都没有
鸡又从1到35
匹配下来
找到一个最合适的结果
这就是计算机做事的方式
它不怕麻烦
因为它速度很快
但是呢
使你写这个程序的时候
很简单
在这个简单的过程里边
它已经执行了
它的循环的次数
就是说
内循环外循环已经
循环了
非常多的次数
我们看一下这道程序
计算机怎么做
我们过来看一下
计算机是怎么
完成这样鸡兔同笼的问题呢
当然确切的说
不是计算机是怎么做
是 我们让计算机怎么做
我们刚才说了
这类问题我们让计算机做的话
它的长项是
穷举
把所有例体遍历一遍
在这里边我们先看
内循环里我们最终关注的是什么
最终关注的就是
你给我输出
鸡到底是多少
兔到底是多少
我们给
鸡和兔
分别定义的是
x y
鸡是多少兔是多少呢
是根据
条件判断来的
这道题目里的条件
我们有两个约束
一个约束说
35个脑袋
另一个约束说
94个
94条腿
这就是我们说的两个约束
35个脑袋是谁呢
是 x
鸡和兔啊
它和起来是35个脑袋
94条腿
也是
鸡和兔的
鸡是两条腿
那就是两个x
那加上
4个y
这个
算术运算的结果和94去比较
前面呢
这是一个比较
后边一个比较
这两个比较是
或的关系还是与的关系呢
题目里边说
它们必须同时满足这两个条件
那就是&
&的这块 大家别忘了
我们
&的后边是一个
关系运算
所以呢
你得把这个括号加上
前面一样
我们前面也是一个关系比较运算
我们把前面这个括号也加上
这是大家平常构建表达式
容易疏忽的地方
大家看这个表达式有没有写对
这两个条件
x加y
一定是
35
并且
它们的脚一定是94
如果满足这个条件
这个组合
就找对了
就是我们要的结果
这个组合到底是
一组 两组
还是若干组呢
是在于
满足这个条件的
一共有多少
这是我们
循环体里边要做的事情
那怎么构建这个循环呢
我们刚才在分析的时候说
什么叫穷举
穷举就是一个
遍历
假如兔没有
鸡 从0到35
或者鸡没有
兔从0到35
对于这个具体的题目来说
能这样分析吗
题目的约束是
鸡兔同笼
那能是鸡没有兔没有吗
没有这种
只有一种它不同笼了
所以呢
这道题目的
根据题目的意思
一定是
鸡至少有一只
兔也至少有一只
大家循环从1开始
那循环从1开始
那就是
到不了35
顶多是
34了
所以小于35
因为
当鸡是34只的时候
兔是一只
那就是35只了
循环应该是这样
那这块x加加
同样的道理
兔也是
y是小于35的
不能等于35
然后呢
y
加加
这是
我们构建起来的循环
大家看
这个里边还缺什么吗
我们运行一下看看
大家在运行之前
稍微
看一下
这个里边的if
被执行了多少次呢
我们说
printf被执行了多少次
是有数的
为什么呢
你满足条件我才执行
无论你是在
哪里
满足if这个条件
它是if里边的一个块
满足条件才执行
而这个if被执行了多少次呢
它套在了内循环里边
那一定是外循环34次
内循环34次
那是34乘34
那得有一千多次
那大家看
这里边运行的时候一定有歇息
得等
那我们看
鸡是23
兔是12
这是只有一组结果
那就是说这道题解出来
只有一组解
刚才if被执行了
一千多次
我们看瞬间就过去了
是不是执行了那么多次呢
我们可以设一个计数器看一下
n
然后呢
在这
来做一个n加加
当然加完了你最后
别忘了把它输出
要输出的是
n里边的内容
然后我们给一个百分号
d
要的是谁呢
n
完了吗
运行一下看看
return
有问题吗
刚才没改它
往上看
printf里边
少了一个分号
再来看看
鸡和兔
23 12没问题
循环了多少次呢
负的这么大的一个数
为什么会是负的次数呢
回过头来看一下
n
n加加
有问题吗
问题在哪
问题在于n没有赋值
没有赋初值就用了
所以它在一个随机数的基础上
做的运算
所以
这个初值
相当重要
再运行一遍
n是多少了
是 34乘以34
1156次
我们通过刚才的
在加了这个
一个计数器的过程里边
我是想说明
现在大家
开始编一些有几行代码的程序了
常常会碰到一些问题
并不是循环这里边的问题
而是从一开始
循序结构的 选择结构的
就是每一个问题里边
甚至是
像我们刚才说的
赋初值的问题
带来的一些错误
而这种错误
不是每一次都能像
我们这道题这样显示的表达
比如说我循环多少次
来了一个负的次数
这显然让我就知道它是错的
可是有时候也碰到
也不是这么明显
但是编译器并不告诉你错
为什么呢
是因为它执行没有障碍
它一样能往下执行
它能出一个结果
它就不告诉你错
什么时候会告诉你错呢
编译器做不下去了
像我们刚才碰到了
我到return0时候错了
我要返回去的时候
为什么会说错呢
你这个函数调用的这个语句
你没有分号啊
没有分号我就认为
这个语句和下边的return0
是一个语句
有这样的句子吗
没有啊
所以它就告诉我这一句话错了
而这句话并没有错
它是把这两句话
连起来看成一个句子
所以我们往上找
是这块
少了一个分号
加上分号就没有问题了
所以大家现在在调程序的过程里边
有一些
多多少少的
都有一些这样的问题
这个问题是
熟能生巧
大家要多练习
才能够知道
那我们
对于这个程序
回过头来
咱再看一下
实际上最简单的
我要不用计数器的话
我就是两个循环
从1到34循环
1到34循环
然后在这做判断
最后输出
这就是鸡兔同笼的问题
那么大家一定会说
我们在中学里边就
看见过
很多关于鸡兔同笼的求解的方式
那么对这道题来说
可不可以有一种方式说
它不循环这么一千多次呢
大家作为一个讨论
我们下边看看
即便是计算机做这件事
有没有更好的算法
使它的
循环
使它的
程序的执行效率更高
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html