Python 应用之丑数的判断
说法一:把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 7、14 不是,因为它们包含质因子 7。 习惯上我们把 1 当做是第一个丑数。
前 20 个丑数为:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36。
说法二:对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于 S。这个正整数集合包括,p1、p1*p2、p1*p1、p1*p2*p3...(还有其它)。该集合被称为 S 集合的“丑数集合”。注意:我们认为 1 不是一个丑数,丑数集合中每个数从小到大排列,每个丑数都是素数集合中的数的乘积。(如 S={2,3,5}时,对应丑数集合为 U={2,3,4,5,6,9,10,15,25,30})
1.问题描述
把只包含质因子 2,3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 7、14 不是,因为它们包含质因子 7。 习惯上我们把 1 当做是第一个丑数。要求:输入一个数,判断是否是丑数或者输出某一范围内的所有丑数。
2.解题思路
由于因子只能是 2,3,5 这三个特殊数字,所以可以把这三个数字做成列表进行判断
遍历小于该数的除了 1 以外的最小因子,判断其是否在 2,3,5 之间
若不在内部可以直接输出其不是丑数
若是 2,3,5 之一,则可以使用剩下的数,再次判断其最小因子,直至数变成 2,3,5 后,可确定其是丑数,循环
3.解题方法
第 1 行: 将三个特殊数字 2,3,5 建立成一个列表
第 3 行: 创建丑数函数 UglyNumber,并输入 m 作为它的变量
第 4 行: 使用 n 来替代 m 的值,n 用于变化,m 用于表示原数
第 6-11 行: 判断 n 是否为 1,2,3,5 之间的一个,若是,打印 m 是完数且结束循环
第 12-13 行: 若 n 不是 1,2,3,5 之间的一个,定义 b=0,用处稍后介绍
第 14-16 行: 使用 for 循环遍历 2,3,5 这三个数,判断 2,3,5 是否是其因数,若不是,b 的值加一
第 17-19 行: 只要 2,3,5 之间有一个数为 n 的因数,则替换 n 为 n 除以因数之后的值,并使用 continue 结束本次循环,进行下次循环判断 n 是否是丑数
第 20-22 行: 如果 b=3,则表示 2,3,5 之间任何一个数都不是 n 的因子,则 n 不是丑数,那么 m 也不是丑数
第 25-26 行: 输入一个整数并将其值返回给 m,打印其是否是丑数
代码运行结果为:
4.小思考
那么如果要求输出一万以内的所有丑数,应该如何修改呢?
版权声明: 本文为 InfoQ 作者【向阳逐梦】的原创文章。
原文链接:【http://xie.infoq.cn/article/d02b4e925184ab125b9d6257d】。文章转载请联系作者。
评论