最近事情比较多,python还在学习之中,更新速度慢了一些。今天就2例。 |
例9:一个数如果恰好等于它的因子之和,这个数就称为“完数”。如6=1+2+3.编程找出1000之内所有的完数并打印出来。
求解分析:关键就是把一个数的因子都找出来。取余为零,再加一个比较条件而已。利用了sum()来快速求和。
*列表真是好东西。
代码如下:
测试结果:
拓展:如果要求打印出
6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248
程序要怎么改?
——————————————————————————————————
例10:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少个?
求解分析:
天数 | 1 | 2 | 3 | 4 | |
吃掉 | c1=s0/2+1 | c2=s1/2+1 | c3=s2/2+1 | c4=s3/2+1 | |
剩下 | s0=n | s1=s0-c1 | s2=s1-c2 | s3=s2-c3 | s4=s3-c4 |
天数 | 5 | 6 | 7 | 8 | 9 |
吃掉 | c5=s4/2+1 | c6=s5/2+1 | c7=s6/2+1 | c8=s7/2+1 | c9=s8/2+1 |
剩下 | s5=s4-c5 | s6=s5-c6 | s7=s6-c7 | s8=s7-c8 | s9=s8-c9=1 |
第九天吃完还剩下1个桃子,所以s9=1。
s8=2*(s9+1)=2*(1+1)=4
……
倒推上去,可以得到s0=2*(s1+1)
代码如下:
测试结果:
拓展:看了求解分析,可以看出用递归算法肯定可以。你可以尝试写一下吗?欢迎交流。
编程能培养学生的思维,我没怀疑过。