![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=1738943287-VJwPcFO3lgGdQzdZAYWRWz6rdHa7WC6r-0-d88d8e9f071b6ae0e041b7a0d7cf19c7)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_41_05.jpg?sign=1738943287-dLU1mE748DueXGiTEOSelizuPhwNShkh-0-b61332ff0bc7432b3b184a94657ec126)
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_42_01.jpg?sign=1738943287-wX2KiEQS2iKZMQzfNuIx3NwcdVA7Ehyl-0-6d0952839b186b16aacdd727588518d4)
这种算法比较好理解,先设定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=1738943287-09bf7g1rceC2poCfA7VwpRuDhnEfcqgE-0-7628b3e71ed3e05a68567be979b40395)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_42_03.jpg?sign=1738943287-JnwucpuZvtyniWt1XT73Hi4qIPvfPBmS-0-4d38c03de5759eab4e66f05201c1a876)
先建立一个所有三位数的循环,依次求出百位、十位和个位数字,进行判断,如果百位、十位和个位的立方和等于原数字,则输出,循环结束后就能得到所有这样的三位数。
【例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=1738943287-IAxyxmTDsLOVy28dfcQMBus7bdQJRp5T-0-c36cbbae47c4988c9da92f991f2cc08a)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_02.jpg?sign=1738943287-gt7Yr3so3ZEKJarmjb5Y7G0KnqthINjF-0-dbd3a7829efd80c03346a2cfa4a0e4c4)
设计算法的关键是找到分子、分母的变化规律,分母比前一个分数的分子多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=1738943287-IvYzIJSlOF14GZfOyOkYDZRqWcWRTfcv-0-bc119e64adfb35b0dff9aec585854790)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_43_04.jpg?sign=1738943287-T484OuDkGKPQycz4DEgh839nvgVGTprq-0-a867a2c70a4aaf18f4e865f8adb17264)
这个问题的一种比较简单的处理方式利用了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=1738943287-W59BCmV8tsBEVm1pAZnXYhedN16kSPG9-0-ea7c0c093a8317fa9e3715451c8031c6)
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_44_01.jpg?sign=1738943287-yvqcO4RMVUPTGniSQwAmpNvZDISd4g5y-0-33cf1a822eeb92c851d4ca8a6e71b517)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_44_02.jpg?sign=1738943287-UPth2HpID5lQsl4TfSLAuH5F6rHKosV9-0-58d6e6f6fa0e303abe78a8f00dce7b09)
以7月4日为例,先将前6个月的天数加起来,再加上7月的4天即可,注意考虑特殊情况,闰年2月有29天,当输入闰年且月份大于2时要多加一天。