资源简介 4.4.3循环嵌套 百钱百鸡问题 今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。凡百钱买鸡百只。问鸡翁母雏各几何? 【故事】 相传在南北朝时期(公元 386 年——公元 589 年),我国北方出了一个“神童”,他反映敏捷,计算能力超群,许多连大人一时也难以解答的问题,他一下子就给算出来了。远远近近的人都喜欢找他计算数学问题。 “神童”的名气越来越大,传到当时宰相的耳中。有一天,宰相为了弄清“神童”是真是假,特地把“神童”的父亲叫了去,给了他 100 文钱,让第二天带 100 只鸡来。并规定 100 只鸡中公鸡、母鸡和小鸡都要有,而且不准多,也不准少,一定要刚好百钱百鸡。 当时,买 1 只公鸡 5 文钱,买 1 只母鸡 3 文钱,买 3 只小鸡才 1 文钱。怎样才能凑成百钱百鸡呢?“神童”想了一会,告诉父亲说,只要送 4 只公鸡、 18 只母鸡和 78 只小鸡就行了。 第二天,宰相见到送来的鸡正好满足百钱百鸡,大为惊奇。他想了一下,又给了 100 文钱,让明天再送 100 只鸡来,还规定不准只有 4 只公鸡。 这个问题也没有难住“神童”。他想了一会,叫父亲送 8 只公鸡、 11 只母鸡和 81 只小鸡去。还告诉父亲说,遇到类似问题,只要怎样怎样就行了。第二天,宰相见到了送来的 100 只鸡,赞叹不已。他又给了 100 文钱,要求下次再送 100 只鸡来。 岂料才一会儿,“神童”的父亲就送来了 100 只鸡。宰相一数:公鸡 12 只、母鸡 4 只、小鸡 84 只,正好又满足百钱百鸡……。 这个“神童”就是张丘建。他继续勤奋学习,终于成为一个著名的数学家。他的名著《张丘建算经》里,最后一个题目就是这个有趣的“百鸡问题”。 设计算法 算法描述: ①令a=1 ②令b=1 ③令c=3 步长:3 ④如果a+b+c=100(式子1)且5a+3b+c/3=100(式子2),那么输出a,b,c,若不是则转⑤ ⑤如果c<100,则c+3 返④ ⑥如果b<33,则b+1返③ ⑦如果a<20 ,则a+1返② ⑧结束 for 循环变量 in 列表: 语句或语句组 单循环: while (表达式): 语句或语句组 单独使用for 循环和while 循环,往往无法解决复杂的问题。如需要解决类似”工作要做很多遍,而每一遍都是需要重复做一些事情”的问题,就要用到多重循环,即”循环嵌套”。如果某一种循环语句中包含着自身或其他循环语句,就称为循环的”嵌套”。for循环和while 循环之间可以相互嵌套。 for a in range(1,20): for b in range(1,33): for c in range(3,100,3): if (a + b + c == 100) and (5 * a + 3 * b + c / 3 == 100) : print ("公鸡a={}, 母鸡b={}, 小鸡c={}".format(a,b,c)) 编程:百钱百鸡问题 所有的情况都考虑到了吗?有没有遗漏?循环多少次?效率高吗? 问:我们可以用几种方法来解决这个问题呢? 三种 1.用三重循环来做(1种方法) 2.用二重循环来做,判断条件可以用式子1 或式子2。(2种方法) 方法 2: for a in range(1,20): for b in range(1,33): c=100-a-b (利用式子1得到) if 5 * a + 3 * b + c / 3 == 100 : print ("公鸡a={}, 母鸡b={}, 小鸡c={}".format(a,b,c)) 问:我们可以用几种方法来解决这个问题呢? 三种 1.用三重循环来做(1种方法) 2.用二重循环来做,判断条件可以用式子1 或式子2。(2种方法) 方法 3: for a in range(1,20): for b in range(1,33): c=3*(100-5*a-3*b )(利用式子2得到) if a + b + c == 100 : print ("公鸡a={}, 母鸡b={}, 小鸡c={}".format(a,b,c)) 如果一个三位数等于它的各位数字的3次方各,则这个3位数称为“水仙花”数,例如153=13+53+33。试编写程序求出所有的水仙花数。 任务:水仙花数问题: 大展身手 任务:水仙花数问题 for a in range(1,10): for b in range(0,10): for c in range(0,10): n = a *a*a + b*b*b + c*c*c If n ==a * 100 + b * 10 + c: print(n) 如果一个三位数等于它的各位数字的3次方各,则这个3位数称为“水仙花”数,例如153=13+53+33。试编写程序求出所有的水仙花数。 设这个三位数为n,它的百位数为a,十位数为b,个位数为c 思考:还有其它方法吗?可以用单循环for语句吗? for x in range(100,1000): a=x%10 b=x//10%10 c=x//100 if a*a*a+b*b*b+c*c*c==x: print(x,end=" ") 设这个三位数为x,百位为c,十位为b,个位为a,那么: 练习题: 执行以下程序段后,变量t的值是( ) t=0 for x in range(2,4): n=1 while n<=x: t=t+n n=n+1 print(t) A.8 B.9 C.10 D.11 B 练习题: 执行以下程序段后,输出结果是( ) m=0 for i in range(1,16,4): for i in range(3,20,4): m=m+1 print(m) A.12 B.15 C.20 D.11 C 课后作业: 尝试用循环嵌套打印输出如下图形: * *** ***** ******* 谢 谢 展开更多...... 收起↑ 资源预览