当前课程知识点:C语言程序设计(上) >  循环结构的程序设计(二) >  4.7 循环的综合应用 >  4.7.2 循环综合应用——穷举算法

返回《C语言程序设计(上)》慕课在线视频课程列表

4.7.2 循环综合应用——穷举算法在线视频

4.7.2 循环综合应用——穷举算法

下一节:4.7.3 循环综合应用——满足条件的数

返回《C语言程序设计(上)》慕课在线视频列表

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循环

然后在这做判断

最后输出

这就是鸡兔同笼的问题

那么大家一定会说

我们在中学里边就

看见过

很多关于鸡兔同笼的求解的方式

那么对这道题来说

可不可以有一种方式说

它不循环这么一千多次呢

大家作为一个讨论

我们下边看看

即便是计算机做这件事

有没有更好的算法

使它的

循环

使它的

程序的执行效率更高

C语言程序设计(上)课程列表:

从问题到C语言程序设计

-1.1 计算机的问题求解方法

--1.1.1--程序设计面向的问题

--1.1.2--关于计算

--1.1.3-1关于算法-算法的特征

--1.1.3-2关于算法——算法的表示

--1.1.3-3关于算法——算法的优化

--1.1.4-1-程序设计方法

--1.1.4-2-程序设计方法

--讨论题:数学模型

-1.1 计算机的问题求解方法--作业

-1.2 C语言与C程序

--1.2.1-1-C概述

--1.2.1-2-C概述

--1.2.2-C初步

--讨论题:运算符

-1.3 C语言处理系统与程序调试运行

--1.3.1C程序如何调试运行

--1.3.2常用C语言处理系统

--1.3.3DEVC++的使用-v1

--1.3.4C语言概貌小程序

--例程

-1.4 程序中的人机交互

--1.4 printf用法

--1.4.2 scanf的用法

--例程

--作业讨论区

数据计算实现与顺序结构程序设计(一)

-2.1 算术运算的C程序实现

--2.1.1 第二章

--2.1.2 C语言算术表达式概念

--2.1.3 算术运算的实现

--2.1.4 整数相除

--2.1.5 输入格式造成的计算错误

--2.1.6 求余运算

--2.1.7 自增自减运算

--2.1.8 复合运算

--fangcheng.c

--fangcheng-1.c

--fangcheng-2.c

--fangcheng-3.c

--fangcheng-4.c

--算术混合运算.c

--讨论题:自增自减符

--讨论题:程序输出结果

--讨论题:程序运行结果

-2.1 算术运算的C程序实现--作业

-2.2 关系运算的C程序实现

--2.2.1 关系比较问题

--2.2.2 C语言关系表达式

--2.2.3关系运算优先级

--2.2.4 用关系运算做判断条件

--2.2.5 程序实例

--2.2.6 字符比较

--bukao.c

--pingshifen-1.c

--panduanzhengshu.c

--pingshifen-2.c

--字符比较.c

--讨论题:比较大小

--讨论题:程序的运行

-2.2 关系运算的C程序实现--作业

-第二周作业--作业

数据计算实现与顺序结构程序设计(二)

-2.3 逻辑运算的C程序实现

--2.3.1 逻辑运算问题~1

--2.3.2 逻辑运算表达式

--2.3.3 如何判断闰年

--2.3.4 逻辑运算优先级

--2.3.5 条件运算符

--计算结合性

--2.3.7 一个简单实例

--闰年.c

--自动购票问题.c

--讨论题:逻辑表达式

-2.3 逻辑运算的C程序实现--作业

-2.4 位运算的C程序实现

--2.4.1 什么是位运算

--2.4.2 位运算有哪些

--2.4.3 位运算怎么用

--讨论题:位运算

-2.5 几种很个别的运算

--2.5 几个很个别的运算

--讨论题

--讨论题

-2.5 几种很个别的运算--作业

-2.6 混合运算及数据类型转换

--2.6 混合运算及数据类型转换

--讨论题:数据类型

-2.7 顺序结构程序实例

--2.7.1 第一个程序:三角形

--Video

--三角形面积.c

--讨论题:工业产值

--讨论题:程序无效结果

-2.7 顺序结构程序实例--作业

选择结构的程序设计

-3.1 程序中的路径选择实现

--3.1.1_1 第三章

--3.1.1_2 神奇的if_else

--打印学生成绩.c

--一元二次方程.c

-3.1 程序中的路径选择实现--作业

-3.2 路径中的再选择——嵌套判断

--3.2.1_1 if语句的嵌套

--3.2.1_2三个数排序1029

--例程

--3.2.2 用户登录检查

--三个数排序_未优化.c

--三个数排序_优化.c

--讨论题:程序改错

-3.2 路径中的再选择——嵌套判断--作业

-3.3 复杂判断问题的C程序设计

--3.3 多级选择

--银行存款.c

--讨论题:多级选择

-3.4 多分支问题的C程序设计

--3.4.1 switch语句表达式

--3.4.2 加减乘除计算

--3.4.3 几类说明

--加减乘除运算.c

--讨论题:关于switch

-3.4 多分支问题的C程序设计--作业

-3.5 GOTO的适当使用

--3.5 GOTO的适当使用

-3.6 选择结构的程序实例

--3.6 程序展示

--计算第几天.c

--存款利息__switch实现.c

--讨论题:输出奇数

--讨论题:计算税金

-3.6 选择结构的程序实例--作业

-第四周作业--作业

循环结构的程序设计(一)

-4.1 需要重复执行的程序

--4.1.1----第四章~1

--4.1.2---while实现先判断后循环~1

--4.1.3----while循环的应用-录入速度~1

--求和.c

--打印学生成绩.c

--统计录入速度.c

--求平均数.c

-4.1 需要重复执行的程序--作业

-4.2 至少要执行一次的循环

--4.2.1至少要执行一次的循环

--4.2.2-do-while循环应用

--成绩录入_do while实现.c

--n的阶乘.c

--字符分类统计.c

--讨论题:关于while

-4.2 至少要执行一次的循环--作业

-4.3 已知循环次数用for语句

--4.3.1--用for语句控制循环次数

--4.3.2--循环的应用-求和

--求和问题.c

--斐波那契数列问题.c

--数列求和.c

--讨论题:循环语句的不同

--讨论题:循环语句

-4.3 已知循环次数用for语句--作业

-4.4 循环控制——简单循环应用

--4.4.1-循环的应用-找数-水仙花数

--4.4.2--循环的应用-求素数

--水仙花数.c

--讨论题:死循环

--讨论题:continue和break

--讨论题:猜数字

-循环结构的程序设计(一)--4.4 循环控制——简单循环应用

循环结构的程序设计(二)

-4.5 循环的嵌套

--4.5.1 循环的嵌套——九九乘法表

--4.5.2 循环的嵌套——打印三角形

--打印九九乘法表.c

--打印实心三角图案.c

--打印空心三角图案.c

--讨论题:程序运行

-4.5 循环的嵌套--作业

-4.6 break与continue

--4.6 循环中断与继续循环——break再讨论

--最大素数.c

--求正数个数及平均数.c

-4.6 break与continue--作业

-4.7 循环的综合应用

--4.7.1 数的排列组合问题

--4.7.2 循环综合应用——穷举算法

--4.7.3 循环综合应用——满足条件的数

--4.7.4 循环综合应用——求最后三位数

--4.7.5 循环综合应用——打印空心图案

--数的排列组合.c

--数的排列组合优化.c

--鸡兔同笼.c

--找满足条件的数.c

--输出14的13次方的最后三位数.c

--打印空心字符.c

--讨论题:打印图形

--讨论题:打印空心图形

--讨论题:计算闰年

-第六周作业

--虚拟实验:循环程序设计实验

-第六周作业--作业

数组(一)

-5.1 同类有序数据处理问题

--5.1.0 数组开篇

--5.1.1 同类有序数据存储问题

--讨论题:下标变量与下标

-5.2 一维数组的定义和引用

--5.2.1_1 数组的定义~1

--5.2.1_2 数组的初始化

--5.2.2 一维数组的输入输出

--5.2.3 一维数组的应用1--成绩排序(选择法)~2

--5.2.4 一维数组的应用2--Fibonacci数列

--数组定义.c

--数组初始化.c

--输出大于平均值的数.c

--反向输出.c

--选择法_成绩排序.c

--求斐波那契数列前n项.c

--讨论题:对称数

--讨论题:关于'\0'

-5.2 一维数组的定义和引用--作业

-5.3 一维字符串数组

--5.3 一维字符串数组11.24~1

--用函数测试字符串长度.c

--讨论题:编程

-5.4 字符串处理函数

--5.4 字符数组的输入与输出

--字符串反向.c

--字符串函数

--讨论题:程序如何运行

--讨论题:黑色星期五

数组(二)

-5.5 二维数组的定义与使用

--5.5 二维数组定义

--二维数组的定义与初始化.c

-5.6 二维数组的输入输出

--5.6 二维数组的输入与输出

--二位数组输出_矩阵输出.c

--讨论题:随机数据存储

-5.6 二维数组的输入输出--作业

-5.7 二维数组的应用‍

--5.7.1二维数组的应用-转置矩阵

--5.7.2 用一维数组方式引用二维数组元素

--转置矩阵.c

--找二维数组最大数.c

--讨论题:修改程序

--讨论题:关于随机数函数 rand()

-5.8 二维字符数组

--5.8 单词排序

--单词排序.c

--讨论题:回文字符串

-5.8 二维字符数组--作业

-5.9 数组综合应用

--5.9.1 应用1——学生成绩统计

--统计成绩.c

--5.9.2 应用2——删除重复字符

--删除串中的重复字符串

--5.9.3 应用3——统计字符

--5.9_4数组的应用4--矩阵相乘

--统计字符次数.c

--讨论题:洗牌

-本期课程结束语

--end

-第八周编程作业

--虚拟实验:冒泡排序算法程序设计实验

期末复习

-《C语言程序设计(上)》期末复习参考

--html

期末复习答案

-《C语言程序设计(上)》期末复习参考答案

--html

4.7.2 循环综合应用——穷举算法笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。