![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=1739558591-qX4lSmyFAnfFWO9mGP6Zp3r2GsA3ddc2-0-9dd781c88867ed7889b9979adb0791e2)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_41_05.jpg?sign=1739558591-tmBOicdlFC2jfx90ZVNMyuMjWSvPzgin-0-107d508844bc5f9e45611b4c7e4454f0)
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_42_01.jpg?sign=1739558591-fOQF5ayFPhmJdOl4oMQKPGBnJrQt9Cun-0-250280b797cddf35caeb34f79a407b6c)
这种算法比较好理解,先设定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=1739558591-XLzzJdafS5z9U68ZQ8RVVnxOUjdeR03q-0-25ac4010db61c507f434bc0f1da9348d)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_42_03.jpg?sign=1739558591-m1t5Vqq3eeEyOhMMy3ETtcSiN8dwaKHL-0-5e5e4f9fa31021d1a4e6a42be48fd87c)
先建立一个所有三位数的循环,依次求出百位、十位和个位数字,进行判断,如果百位、十位和个位的立方和等于原数字,则输出,循环结束后就能得到所有这样的三位数。
【例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=1739558591-yKqveNeHeR9qOoyAXb74HIre8gQUnAkM-0-93affefde7897a38f600fd0580b9df0d)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_02.jpg?sign=1739558591-vF99IJU4BZBiNDDRYZbyK470xHJeuaA9-0-da7798fecc3ae96620521363228a7a13)
设计算法的关键是找到分子、分母的变化规律,分母比前一个分数的分子多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=1739558591-N7wwBL6Vq7dnK7PhX7kPE5sxWBsuB0lE-0-8c3b77e31fc4fc005cb1bfe7ad604173)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_04.jpg?sign=1739558591-4YKtbncgWo159qY9puwaWfn4R7oPWoRr-0-a75bcff25bdb057ae2b0c15aee72db3b)
这个问题的一种比较简单的处理方式利用了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=1739558591-XWl1shxUHKt6hDLh7prDQSlqa7kEsciG-0-a72fdea2d2712476f674f87a2d205229)
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_44_01.jpg?sign=1739558591-5ZxNVOrTbfnSZ5CmIiYkGsEaqyQ7tvvy-0-589a2c003df7d1141ca4679ff1f0a0bd)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_44_02.jpg?sign=1739558591-XbNpSGvlE0m2QWe9ibIwzUdm7T5Zd0fG-0-1b32a175a70816adf149e4ec750b073a)
以7月4日为例,先将前6个月的天数加起来,再加上7月的4天即可,注意考虑特殊情况,闰年2月有29天,当输入闰年且月份大于2时要多加一天。