小U的完美数挑战

153 阅读2分钟

问题描述

小U定义了一个特别的数,称之为“完美数”,当且仅当这个数中只有一个非零的数字。 例如5000, 4,1,10,200都是完美数。 现在,小U手中有一个大小为 n 的数组。她希望从中选择两个元素,使得它们的乘积是一个完美数。小U想知道,共有多少种不同的选择可以满足这一条件?

问题解析

1. is_perfect_number 函数

def is_perfect_number(num: int) -> bool: # 将数字转换为字符串 num_str = str(num) # 统计非零字符的数量 non_zero_count = sum(1 for char in num_str if char != '0') # 判断非零字符的数量是否为1 return non_zero_count == 1

  • 功能:判断一个数是否是完美数。

  • 步骤

    1. 将数字转换为字符串:使用 str(num) 将整数 num 转换为字符串 num_str
    2. 统计非零字符的数量:使用生成器表达式 sum(1 for char in num_str if char != '0') 统计字符串 num_str 中非零字符的数量。
    3. 判断非零字符的数量是否为1:如果非零字符的数量为1,则返回 True,否则返回 False

2. solution 函数

def solution(arr: list) -> int: # 初始化计数器 count = 0

# 遍历数组中的每一对元素
for i in range(len(arr)):
    for j in range(i + 1, len(arr)):
        # 计算乘积
        product = arr[i] * arr[j]
        # 判断乘积是否是完美数
        if is_perfect_number(product):
            # 如果是完美数,计数器加1
            count += 1

# 返回满足条件的对数
return count
  • 功能:计算数组中满足条件的对数。

  • 步骤

    1. 初始化计数器:将计数器 count 初始化为0。
    2. 遍历数组中的每一对元素:使用双层循环遍历数组中的每一对元素。外层循环从 i 开始,内层循环从 i + 1 开始,确保每个元素对只计算一次。
    3. 计算乘积:计算当前元素对 arr[i] 和 arr[j] 的乘积 product
    4. 判断乘积是否是完美数:调用 is_perfect_number(product) 判断乘积是否是完美数。
    5. 如果是完美数,计数器加1:如果乘积是完美数,则将计数器 count 加1。
    6. 返回满足条件的对数:返回计数器 count 的值,即满足条件的对数。
  • 功能:测试 solution 函数。

  • 步骤

    1. 调用 solution 函数并传入测试用例:分别传入三个测试用例 [25, 2, 1, 16][5, 50, 500, 5000] 和 [2, 10, 100, 1000]
    2. 打印结果,判断是否符合预期:打印 solution 函数的返回值,并判断是否等于预期结果。

优化建议

1. 优化 is_perfect_number 函数

当前的 is_perfect_number 函数已经比较简洁,但可以考虑进一步优化: