You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:编写函数找出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)

代码问题分析

  1. abundantNums和AbundantSums里的i+=1完全多余:for i in range(...)会自动按序列迭代,手动修改i不会改变循环的迭代顺序,反而可能导致逻辑混乱,直接删掉即可。
  2. AbundantSums重复生成过剩数列表:已经有abundantNums函数可以生成列表,直接调用即可,不用重复写判断逻辑。
  3. AbundantSums的循环逻辑错误:当前代码只让第0个元素和后面的元素相加,没有实现“第1个元素与第1到最后一个元素相加”的逻辑,而且没有处理重复的和。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:10:53