技术问询:编写函数找出v以下可表示为两个过剩数之和的正整数
问题需求
编写一个函数,返回所有小于v的、可表示为两个过剩数之和的正整数列表。
我的思路与现有代码
我是编程新手,代码写得很乱,甚至有一半都看不懂。我尝试了多种方法,思路是:将过剩数列表的第0个元素依次与第0、1…最后一个元素相加,再将第1个元素依次与第1、2…最后一个元素相加。
以下是我尝试的代码:
def divisors(a): b=[] for i in range(1,a): if a%i==0: b.append(i) if sum(b)>a: return True else: return False
def abundantNums(n): list1=[] for i in range(1,n): if divisors(i): list1.append(i) i+=1 else: i+=1 return(list1)
def AbundantSums(v): answers=[] x=0 h=0 list1=[] for i in range(1,v): if divisors(i): list1.append(i) i+=1 else: i+=1 l=len(list1) for k in range(1,l+1): if list1[x]+list1[h]<=v: answers.append(list1[x]+list1[h]) h+=1 print(answers)
代码问题分析
abundantNums和AbundantSums里的i+=1完全多余:for i in range(...)会自动按序列迭代,手动修改i不会改变循环的迭代顺序,反而可能导致逻辑混乱,直接删掉即可。AbundantSums重复生成过剩数列表:已经有abundantNums函数可以生成列表,直接调用即可,不用重复写判断逻辑。AbundantSums的循环逻辑错误:当前代码只让第0个元素和后面的元素相加,没有实现“第1个元素与第1到最后一个元素相加”的逻辑,而且没有处理重复的和。divisors函数效率低:遍历到a-1来寻找约数,其实遍历到sqrt(a)就可以,能大幅提升速度。
修正后的代码
1. 判断一个数是否为过剩数
def is_abundant(a): # 处理特殊情况:1没有除自身外的约数,肯定不是过剩数 if a == 1: return False # 1是所有正整数的真约数,先初始化和为1 divisor_sum = 1 sqrt_a = int(a ** 0.5) # 从2遍历到平方根,减少循环次数 for i in range(2, sqrt_a + 1): if a % i == 0: divisor_sum += i # 如果约数对的两个数不相等,也要加上 counterpart = a // i if counterpart != i: divisor_sum += counterpart # 真约数和大于自身则是过剩数 return divisor_sum > a
2. 生成所有小于n的过剩数列表
def get_abundant_numbers(n): abundant_list = [] for num in range(1, n): if is_abundant(num): abundant_list.append(num) return abundant_list
3. 生成所有小于v的两个过剩数之和的列表
def get_abundant_sums(v): abundant_nums = get_abundant_numbers(v) # 用集合存储和,自动去重 sums_set = set() length = len(abundant_nums) # 外层循环遍历每个过剩数 for i in range(length): num1 = abundant_nums[i] # 内层循环从i开始,避免重复计算(比如num1+num2和num2+num1是同一个和) for j in range(i, length): num2 = abundant_nums[j] current_sum = num1 + num2 if current_sum < v: sums_set.add(current_sum) # 把集合转成排序后的列表返回 return sorted(sums_set)
代码说明
- 函数命名更直观,比如
is_abundant明确表示判断是否为过剩数,get_abundant_numbers表示生成过剩数列表,方便理解。 - 优化了过剩数的判断逻辑,减少循环次数,提升效率。
- 使用集合存储和,自动去除重复的结果,最后转成排序后的列表返回,符合需求。
- 严格按照你的思路实现:每个过剩数只和自身及后面的过剩数相加,避免重复计算。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

