问题描述
小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
-
功能:判断一个数是否是完美数。
-
步骤:
- 将数字转换为字符串:使用
str(num)将整数num转换为字符串num_str。 - 统计非零字符的数量:使用生成器表达式
sum(1 for char in num_str if char != '0')统计字符串num_str中非零字符的数量。 - 判断非零字符的数量是否为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
-
功能:计算数组中满足条件的对数。
-
步骤:
- 初始化计数器:将计数器
count初始化为0。 - 遍历数组中的每一对元素:使用双层循环遍历数组中的每一对元素。外层循环从
i开始,内层循环从i + 1开始,确保每个元素对只计算一次。 - 计算乘积:计算当前元素对
arr[i]和arr[j]的乘积product。 - 判断乘积是否是完美数:调用
is_perfect_number(product)判断乘积是否是完美数。 - 如果是完美数,计数器加1:如果乘积是完美数,则将计数器
count加1。 - 返回满足条件的对数:返回计数器
count的值,即满足条件的对数。
- 初始化计数器:将计数器
-
功能:测试
solution函数。 -
步骤:
- 调用
solution函数并传入测试用例:分别传入三个测试用例[25, 2, 1, 16]、[5, 50, 500, 5000]和[2, 10, 100, 1000]。 - 打印结果,判断是否符合预期:打印
solution函数的返回值,并判断是否等于预期结果。
- 调用
优化建议
1. 优化 is_perfect_number 函数
当前的 is_perfect_number 函数已经比较简洁,但可以考虑进一步优化: