![Python基础编程与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/763/42637763/b_42637763.jpg)
2.5 简单算法举例
【例2-6】有4个小球,编号为1、2、3、4,一起放入黑箱子中,每次不放回地取出一个,则取球的顺序有哪些情况?如代码清单2-7所示。
代码清单2-7 模拟取球结果
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_41_04.jpg?sign=1739523910-xsCxvPvauKz4FUqgYn8hZXEZBcoPBUuv-0-1dfbec1ad80bdb78be136fff2619089d)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_41_05.jpg?sign=1739523910-NzZufVGb8DGthKrGQjZWkPQL9scjW7Q8-0-72e247d63adbfe1a568a2d351eeb9975)
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_42_01.jpg?sign=1739523910-FWYuU075DmgEIT4quaDQdLBbca9EldJW-0-00281de80bca0b67e28d250648628c9e)
这种算法比较好理解,先设定4个互不相关的变量i、j、m和n,每个变量的取值都是1、2、3、4,依次取4个变量的值,如果各不相同,则满足题目条件,依次输出这4个变量的值,即为取球的一个顺序。但是这个算法不是最好的,有兴趣的话可以尝试设计其他的算法。
【例2-7】找到所有符合要求的三位数:个位、十位和百位数字的立方和等于该数本身。如代码清单2-8所示。
代码清单2-8 计算特殊数字
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_42_02.jpg?sign=1739523910-IHGSMr3TZqiTEZqxtTCKXu9m4tamTOm2-0-236d7179a41fd25481f22ea60184f76a)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_42_03.jpg?sign=1739523910-0FH1o44irqAt5qQXNjnUjlZA0nrUMstT-0-6f7e18723215dc032be030e19cc76a34)
先建立一个所有三位数的循环,依次求出百位、十位和个位数字,进行判断,如果百位、十位和个位的立方和等于原数字,则输出,循环结束后就能得到所有这样的三位数。
【例2-8】有一个序列:2/1,3/7,10/8,18/15,33/23……先找到规律,再求出这个序列的前10项的和。如代码清单2-9所示:
代码清单2-9 计算序列和
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_01.jpg?sign=1739523910-McFSUipqC0uTnvUQvCrBVKjSCxsndoNQ-0-df3ef432ad1b83e224c962d6963bc13b)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_02.jpg?sign=1739523910-0o8bJm74tdySzK3k3Z9IPovANMxAvkgg-0-e0931eb56a994d74148343ba6cd00423)
设计算法的关键是找到分子、分母的变化规律,分母比前一个分数的分子多5,分子是前一个分数分子与分母的和。找到规律之后,再进行迭代、相加,就简单多了。
【例2-9】求出1!+2!+……+10!的值并打印出来。如代码清单2-10所示:代码清单2-10 计算10的阶乘和
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_03.jpg?sign=1739523910-rVh3Qq9ZxSpvqiD8XzhDBgA61SmWGZ76-0-0178102d2be355bae851282fe50c7c94)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_04.jpg?sign=1739523910-xhRDE7UbhbNLkIxOIh4sAU9PjxNs7RZg-0-d2b884249619773fcec930adfb60aac9)
这个问题的一种比较简单的处理方式利用了1的阶乘就是1本身的性质,后面每个数的阶乘就是前一个数的阶乘再乘以自身,这种算法相对简单,写出来的程序也很简洁。
【例2-10】输入一天的日期(年、月、日),判断这一天是一年中的第几天。如代码清单2-11所示。
代码清单2-11 判断日期
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_05.jpg?sign=1739523910-ZCASjxWYJ1U7Api3SpZqKFzftulxQkE8-0-afaa18ed1aa2846ce04d009b5e86bf76)
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_44_01.jpg?sign=1739523910-ortFSpsx1pS3IWgeJUhUzrffz8Rm3CvU-0-56ca13ce1d3f5c5698121d590254879b)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_44_02.jpg?sign=1739523910-pWFQ3gcpb1Vd0pZjV7ReKcclB7kagisV-0-e6651f922adbea7624976d51a348392a)
以7月4日为例,先将前6个月的天数加起来,再加上7月的4天即可,注意考虑特殊情况,闰年2月有29天,当输入闰年且月份大于2时要多加一天。