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
课后作业:
尝试用循环嵌套打印输出如下图形:
*
***
*****
*******
谢 谢