C语言程序设计---穷举法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析: 分析:这就是穷举法当中的典型例题百钱百鸡问题。 题目要我们找出符合条件的鸡翁、鸡母、鸡雏的 个数。答案显然是一组数据。首先分析一下问题 所涉及的情况。
– 百钱如果全买公鸡,可以买0~20只; – 百钱如果全买母鸡,可以买0~33只; – 百钱如果全买小鸡,可以买0~300只,但百鸡限定最多 99只,小鸡数必须是3的倍数; 综上,我们发现公鸡21种买法,母鸡34种,小鸡33种, 所以总共面临着21 × 34 × 34 = 24276种买法。
穷举法的思路
穷举算法是程序设计中使用得最为普遍、 大家必须熟练掌握和正确运用的一种算法。 它利用计算机运算速度快、精确度高的特 点,对要解决问题的所有可能情况,一个 不漏地进行检查,从中找出符合要求的答 案。
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
用穷举算法解决问题,通常可以从两个方面进 用穷举算法解决问题, 行分析: 行分析: 一、问题所涉及的情况:问题所涉及的情况有 哪些,情况的种数可不可以确定。把它描述出 来。 二、答案需要满足的条件:分析出来的这些情 况,需要满足什么条件,才成为问题的答案。 把这些条件描述出来。 只要把这两个方面分析好了,问题自然会迎刃 而解。
目录 后退 前进 结束 江苏省高淳职教中心校 张建青
分析进入第二步
现在我们已经了解了所有可能的情况,按照穷举 法解题的思路,我们需要设计一下正确买法所需 满足的条件,假设公鸡数为i,母鸡数为j,小鸡数 为k,则得到如下方程:
百钱 百鸡
i *5+j *3+k/3==100 I +j +k==100
目录
江苏省高淳职教中心校 张建青
目录
后退
前进
结束
密码箱问题的演示程序
#include<stdio.h> main() { int i,key; printf("请设定旅行箱的密码 请设定旅行箱的密码(000-999):"); : 请设定旅行箱的密码 scanf("%d",&key); printf("\n你的旅行箱密码是:"); 你的旅行箱密码是: 你的旅行箱密码是 for(i=0;i<=999;i++) if(i==key) if(i<10)printf("00%d\n",i); else if(i<100)printf("0%d\n",i); else printf("%d\n",i); }
C语言程序设计---穷举法 语言程序设计---穷举法
主讲:张建青 主讲: 对象:08计 对象:08计1
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
课程开始的思考题
思考: 思考:某个暑假小明携带密码行李箱外出 旅游,旅行途中发现自己忘记了开锁的密 码,怎么办?
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
我国古代数学家张丘建在《算经》 例 1 : 我国古代数学家张丘建在《算经》中出 了这样一道题目:鸡翁一,值五钱,鸡母一, 了这样一道题目:鸡翁一,值五钱,鸡母一,值 三钱,鸡雏三,值一钱,百钱买百鸡,问鸡翁、 三钱,鸡雏三,值一钱,百钱买百鸡,问鸡翁、 鸡母、鸡雏各几何? 鸡母、鸡雏各几何?
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
完善后的改进程序
#include<stdio.h> main() { int i , j , k; /*准备输出格式 准备输出格式*/ 准备输出格式 printf("\t公鸡 母鸡\t小鸡 公鸡\t母鸡 小鸡\n"); 公鸡 母鸡 小鸡 for(i=0;i<=20;i++) for(j=0;j<=33;j++) { k=100-i-j; if(k%3==0 && i*5+j*3+k/3==100) printf("\t%d\t%d\t%d\n" ,i ,j ,k); } }
我们运行演示一下
江苏省高淳职教中心校 张建青
目录
后退
前进
结束
发现问题
• 运行的结果出人意料,答案变多了,很明 显多出的答案是不合理的(小鸡的数量) • 原因何在? • 分析:在我们减少k循环之后,k的值由表 达式100-i-j提供,很显然,它不能保证出来 的k是3的倍数。 • 改善:加入判断k值为3的倍数的条件。
我们运行演示一下
江苏省高淳职教中心校 张建青
目录
后退
前进
结束
小结思考
刚才的百钱百鸡程序在循环次数上有24276 次之多,那么有什么办法可以减少循环次 数,而又不会遗漏答案呢?
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
提示
程序利用的是三重循环,想要减少循环次 数,那么很显然,可以从以下两个方面思 考:
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
我们将条件方程改变一下: 我们将条件方程改变一下: k=100 - i - j i *5+j *3+k/3==100
如此,便不再需要k循环了 如此,便不再需要 循环了
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
改进后的程序
#include<stdio.h> main() { int i , j , k; /*准备输出格式 准备输出格式*/ 准备输出格式 printf("\t公鸡 母鸡 小鸡 公鸡\t母鸡 小鸡\n"); 公鸡 母鸡\t小鸡 for(i=0;i<=20;i++) for(j=0;j<=33;j++) { k=100-i-j; if(i*5+j*3+k/3==100) printf("\t%d\t%d\t%d\n" ,i ,j ,k); } }
1. 减少i,j,k三个循环中的某一个或者几个的 循环次数 2. 减少循环结构的重数,三重变两重或者一重
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
分析
分析后我们发现第一种思路没前途,因为 取值情况的分析很合理,即便可以减少也 只是一点点,对总数2万多来说,减少的幅 度很不明显。 所以我们考虑第二种思路,减少循环的重 数,我们观察方程后发现,其实,三重循 环可以变成两重循环。
后退
前进
Leabharlann Baidu
结束
江苏省高淳职教中心校 张建青
编写程序
#include<stdio.h> main() { int i , j , k; /*准备输出格式 准备输出格式*/ 准备输出格式 printf(“\t公鸡 母鸡 小鸡 公鸡\t母鸡 小鸡\n”); 公鸡 母鸡\t小鸡 for(i=0;i<=20;i++) for(j=0;j<=33;j++) for(k=0;k<=99;k+=3) if(i+j+k==100 && i*5+j*3+k/3==100) printf(“\t%d\t%d\t%d\n” ,i ,j ,k); }
– 百钱如果全买公鸡,可以买0~20只; – 百钱如果全买母鸡,可以买0~33只; – 百钱如果全买小鸡,可以买0~300只,但百鸡限定最多 99只,小鸡数必须是3的倍数; 综上,我们发现公鸡21种买法,母鸡34种,小鸡33种, 所以总共面临着21 × 34 × 34 = 24276种买法。
穷举法的思路
穷举算法是程序设计中使用得最为普遍、 大家必须熟练掌握和正确运用的一种算法。 它利用计算机运算速度快、精确度高的特 点,对要解决问题的所有可能情况,一个 不漏地进行检查,从中找出符合要求的答 案。
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
用穷举算法解决问题,通常可以从两个方面进 用穷举算法解决问题, 行分析: 行分析: 一、问题所涉及的情况:问题所涉及的情况有 哪些,情况的种数可不可以确定。把它描述出 来。 二、答案需要满足的条件:分析出来的这些情 况,需要满足什么条件,才成为问题的答案。 把这些条件描述出来。 只要把这两个方面分析好了,问题自然会迎刃 而解。
目录 后退 前进 结束 江苏省高淳职教中心校 张建青
分析进入第二步
现在我们已经了解了所有可能的情况,按照穷举 法解题的思路,我们需要设计一下正确买法所需 满足的条件,假设公鸡数为i,母鸡数为j,小鸡数 为k,则得到如下方程:
百钱 百鸡
i *5+j *3+k/3==100 I +j +k==100
目录
江苏省高淳职教中心校 张建青
目录
后退
前进
结束
密码箱问题的演示程序
#include<stdio.h> main() { int i,key; printf("请设定旅行箱的密码 请设定旅行箱的密码(000-999):"); : 请设定旅行箱的密码 scanf("%d",&key); printf("\n你的旅行箱密码是:"); 你的旅行箱密码是: 你的旅行箱密码是 for(i=0;i<=999;i++) if(i==key) if(i<10)printf("00%d\n",i); else if(i<100)printf("0%d\n",i); else printf("%d\n",i); }
C语言程序设计---穷举法 语言程序设计---穷举法
主讲:张建青 主讲: 对象:08计 对象:08计1
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
课程开始的思考题
思考: 思考:某个暑假小明携带密码行李箱外出 旅游,旅行途中发现自己忘记了开锁的密 码,怎么办?
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
我国古代数学家张丘建在《算经》 例 1 : 我国古代数学家张丘建在《算经》中出 了这样一道题目:鸡翁一,值五钱,鸡母一, 了这样一道题目:鸡翁一,值五钱,鸡母一,值 三钱,鸡雏三,值一钱,百钱买百鸡,问鸡翁、 三钱,鸡雏三,值一钱,百钱买百鸡,问鸡翁、 鸡母、鸡雏各几何? 鸡母、鸡雏各几何?
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
完善后的改进程序
#include<stdio.h> main() { int i , j , k; /*准备输出格式 准备输出格式*/ 准备输出格式 printf("\t公鸡 母鸡\t小鸡 公鸡\t母鸡 小鸡\n"); 公鸡 母鸡 小鸡 for(i=0;i<=20;i++) for(j=0;j<=33;j++) { k=100-i-j; if(k%3==0 && i*5+j*3+k/3==100) printf("\t%d\t%d\t%d\n" ,i ,j ,k); } }
我们运行演示一下
江苏省高淳职教中心校 张建青
目录
后退
前进
结束
发现问题
• 运行的结果出人意料,答案变多了,很明 显多出的答案是不合理的(小鸡的数量) • 原因何在? • 分析:在我们减少k循环之后,k的值由表 达式100-i-j提供,很显然,它不能保证出来 的k是3的倍数。 • 改善:加入判断k值为3的倍数的条件。
我们运行演示一下
江苏省高淳职教中心校 张建青
目录
后退
前进
结束
小结思考
刚才的百钱百鸡程序在循环次数上有24276 次之多,那么有什么办法可以减少循环次 数,而又不会遗漏答案呢?
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
提示
程序利用的是三重循环,想要减少循环次 数,那么很显然,可以从以下两个方面思 考:
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
我们将条件方程改变一下: 我们将条件方程改变一下: k=100 - i - j i *5+j *3+k/3==100
如此,便不再需要k循环了 如此,便不再需要 循环了
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
改进后的程序
#include<stdio.h> main() { int i , j , k; /*准备输出格式 准备输出格式*/ 准备输出格式 printf("\t公鸡 母鸡 小鸡 公鸡\t母鸡 小鸡\n"); 公鸡 母鸡\t小鸡 for(i=0;i<=20;i++) for(j=0;j<=33;j++) { k=100-i-j; if(i*5+j*3+k/3==100) printf("\t%d\t%d\t%d\n" ,i ,j ,k); } }
1. 减少i,j,k三个循环中的某一个或者几个的 循环次数 2. 减少循环结构的重数,三重变两重或者一重
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
分析
分析后我们发现第一种思路没前途,因为 取值情况的分析很合理,即便可以减少也 只是一点点,对总数2万多来说,减少的幅 度很不明显。 所以我们考虑第二种思路,减少循环的重 数,我们观察方程后发现,其实,三重循 环可以变成两重循环。
后退
前进
Leabharlann Baidu
结束
江苏省高淳职教中心校 张建青
编写程序
#include<stdio.h> main() { int i , j , k; /*准备输出格式 准备输出格式*/ 准备输出格式 printf(“\t公鸡 母鸡 小鸡 公鸡\t母鸡 小鸡\n”); 公鸡 母鸡\t小鸡 for(i=0;i<=20;i++) for(j=0;j<=33;j++) for(k=0;k<=99;k+=3) if(i+j+k==100 && i*5+j*3+k/3==100) printf(“\t%d\t%d\t%d\n” ,i ,j ,k); }