写点什么

Python 应用之丑数的判断

作者:向阳逐梦
  • 2022 年 10 月 05 日
    四川
  • 本文字数:1161 字

    阅读完需:约 4 分钟

说法一:把只包含质因子 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.解题方法

a = [2, 3, 5]
def UglyNumber(m): n = m while True: if n == 1: return f'{m}是丑数' break elif n in a: return f'{m}是丑数' break else: b = 0 for i in a: if n % i != 0: b += 1 else: n /= i continue if b == 3: return f'{m}不是丑数' break

m = int(input('请输入整数:'))print(UglyNumber(m))
复制代码

第 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.小思考

那么如果要求输出一万以内的所有丑数,应该如何修改呢?

发布于: 刚刚阅读数: 3
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022.06.01 加入

InfoQ签约作者、阿里云“乘风者计划”签约博主

评论

发布
暂无评论
Python应用之丑数的判断_Python_向阳逐梦_InfoQ写作社区