返回

一道面试题:找出这个数组里自除数的序号?自除数解析与python实现

后端

自除数:定义与性质

在数学中,自除数(也称为全除数或完全除数)是指其每个数字都整除数字本身的数。例如,128 是一个自除数,因为 128 除以 1、2、8 都得到整除的结果。

自除数具有以下性质:

  • 1 是唯一的一个一位数的自除数。
  • 任何大于 1 的自除数的末尾数字必须是 0、2、4、5、6 或 8,因为只有这些数字才能同时被 2 和 5 整除。
  • 如果一个数的末尾数字不是 0、2、4、5、6 或 8,那么它肯定不是自除数。
  • 如果一个数的末尾数字是 0、2、4、5、6 或 8,那么它可能是一个自除数,也可能不是。要确定它是否是一个自除数,需要检查它的其他数字是否都能整除它本身。

Python实现:查找自除数

我们可以使用 Python 实现一个算法来查找自除数。算法的步骤如下:

  1. 将给定的数字转换为字符串。
  2. 遍历字符串中的每个数字。
  3. 将每个数字转换为整数。
  4. 检查整数是否能整除给定的数字。
  5. 如果所有数字都能整除给定的数字,那么它就是一个自除数。

以下是Python算法的实现:

def is_self_dividing(number):
  """
  检查一个数字是否为自除数。

  Args:
    number: 要检查的数字。

  Returns:
    如果数字是自除数,则返回 True,否则返回 False。
  """

  # 将数字转换为字符串。
  number_str = str(number)

  # 遍历字符串中的每个数字。
  for digit in number_str:
    # 将数字转换为整数。
    digit_int = int(digit)

    # 检查整数是否能整除给定的数字。
    if digit_int == 0 or number % digit_int != 0:
      return False

  # 如果所有数字都能整除给定的数字,那么它就是一个自除数。
  return True


# 测试算法。
print(is_self_dividing(128))  # True
print(is_self_dividing(129))  # False
print(is_self_dividing(1111))  # True
print(is_self_dividing(123456))  # False

leetcode面试题

leetcode上有一道关于自除数的面试题,题目如下:

给定一个整数 left 和一个整数 right,找出闭区间 [left, right] 范围内所有的自除数,并按顺序输出。

输入示例:

left = 1
right = 22

输出示例:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]

我们可以使用Python代码来解答这个问题:

def self_dividing_numbers(left, right):
    """
    找出闭区间 [left, right] 范围内所有的自除数。

    Args:
        left: 闭区间的左边界。
        right: 闭区间的右边界。

    Returns:
        闭区间 [left, right] 范围内所有的自除数。
    """

    # 创建一个空列表来存储自除数。
    self_dividing_numbers = []

    # 遍历闭区间 [left, right]。
    for number in range(left, right + 1):
        # 检查数字是否为自除数。
        if is_self_dividing(number):
            # 如果是自除数,则将其添加到列表中。
            self_dividing_numbers.append(number)

    # 返回自除数列表。
    return self_dividing_numbers


# 测试算法。
left = 1
right = 22
print(self_dividing_numbers(left, right))  # [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]