110 likes | 266 Views
循环程序设计(枚举算法举例). 算法举例: 1 、穷举算法:对问题的所有可能一一测试,直到找出解或将全部状态测试过为止。 循环控制有两种办法:记数法与标志法。记数法是先要确定循环次数,然后逐次测试,完成测试次数后,循环结束。标志法是循环次数无法事先确定的情况下,就确定一个结束目标,达到目标后,使循环结束。. Cocks+hens+chichs=100; 5*cocks+3*hens+chicks/3=100;. Cocks: 0-------19; Hens: 0--------33; Chicks: 0------100;.
E N D
循环程序设计(枚举算法举例) 算法举例: 1、穷举算法:对问题的所有可能一一测试,直到找出解或将全部状态测试过为止。 循环控制有两种办法:记数法与标志法。记数法是先要确定循环次数,然后逐次测试,完成测试次数后,循环结束。标志法是循环次数无法事先确定的情况下,就确定一个结束目标,达到目标后,使循环结束。
Cocks+hens+chichs=100; 5*cocks+3*hens+chicks/3=100; Cocks: 0-------19; Hens: 0--------33; Chicks: 0------100; 循环程序设计(枚举算法举例) • 例1:百钱买百鸡。(鸡翁一值钱五,鸡母一值钱3,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何? 由题意可知
循环程序设计(枚举算法举例) Cocks从0到19,每取一个值,对hens的取值范围内的每个值依次测试,看能找到哪些hens及chicks满足题意(例L3_11) 例2、搬砖问题:36块砖,36人搬,男搬4,女搬3,两个小孩抬一块砖。要求一次全搬完,问男、女、小孩各若干? 解:据题意: men的值:0--8 women的值:0--11 children的值:0--36
循环程序设计(枚举算法举例) 使用枚举法,主要掌握两条原则:1、确定搜索范围。 2、选择搜索策略。 搜索策略选择得好坏,直接决定程序的工作量的大小。 例L3—15:验证素数: 分析:看在2——n/2中能否找到一个整数m能将n整除,若m存在,则n不是素数;若找不到m,则n为素数。
迭代(1) 算法2:迭代。不断用新值取代变量的旧值或由旧值递推出变量的新值的过程。 例如:人口增长问题: 现有12亿人,按年2%的增长速度,10年后将有多少人? 分析:设现有人口数为M,则第一年后人口变为: M*(1+2%),第二年后,把上述赋值表达式再执行一次,要计算10年后的人口,就是把上述表达式执行10次。可以用循环来实现。
迭代(2) 迭代次数 初值; 迭代公式; 迭代与下列因素有关: 例L3—12:兔子繁殖问题: 设有一队新生兔子,从第三个月开始每个月都生一对兔子,按此规律,并假设没有兔子死亡,一年后共有多少兔子?(请同学们写出每月兔子数,找出规律) 每月兔子呈如下规律:1,1,2,3,5,8,13,21,34…… f1=f2=1; f3=f1+f2;f4=f2+f3; …… f n+1=f n+f n-1 找出迭代规律:
例L3_13求2个非负整数的最大公约数。 int gcd( int u, int v) { int r; while (v != 0) { r=u%v; u=v; v=r; } return (u); } u=55 v=15 r=u%v=10 u=15 v=10 r=u%v=5 u=10 v=5 r=u%v=0 u=5 v=0(终止) 迭代(3)
continue语句结束本循环的当次循环、注意与break的区别。continue语句结束本循环的当次循环、注意与break的区别。 1、在循环体中使用break语句时,会使整个循环提前结束,转移到循环体外。 2、continue语句只能用在循环体中,它的作用是跳过其后面的语句。直接将控制转移到下一轮循环。 例:L3—14-1 L3—14—2 Continue 和 break
指出下列程序的运行结果: main() {int x=1,i=1; for ( ;x<50;I++) {if(x>=10) break; if(x%2!=0) {x+=3; continue;} x-=1; } printf(“%d\n”,x); printf(“%d\n”,I); } Main() {int m=7;n=5;i=1; do {if(i%m==0) if(i%n==0) {printf(“%d\n”,i); break;} i++;}while (i!=0) } 练习
作业 • 求两个整数的最小公倍数。 • 找出所有的三位数,要求它的各位数字的立方和正好等于这个三位数。例如:153=13+53+33就是这样的三位数。 • 一位卡车司机违反交通规则,撞死了行人。当时有三位目击者,都没有看清卡车的牌照号码,只记住了牌照的某些特征:甲记住前两个数字是相同的,乙记住牌照的后两位数字是相同的,丙是一位数学家,他说:“牌照号码肯定是一个四位数,并且这个四位数恰好是一个整数的平方。”根据这些,你能否正确判断出牌照号码?(此题为选做题)
作业 • 下面的公式可以用来计算圆周率PI的近似值: PI/8=1/(1*3)+1/(5*7)+1/(9*11)+…… 请编程序计算公式的前15项,看PI的近似值是多少。 • 3.13.4 • 输入一个整数,将此数的每一位数按逆序打印(如输入1235,则输出5321)