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

SPOJ DIVSUM问题:正整数真因数和求解代码调试求助

SPOJ DIVSUM 题目代码调试修复

问题背景

题目要求:给定自然数n(1≤n≤500000),输出其所有真因数的和(真因数指严格小于该数的因数,例如20的真因数为1、2、4、5、10,和为22)。

原代码存在的问题

  1. 真因数判断逻辑错误:当i=1时,配对因数是inp/1=inp,这个数等于原数,不属于真因数,但原代码的i !=1条件逻辑混乱,正确逻辑应该是:只要配对因数不等于原数,就加到总和里。
  2. 无输出结果:主循环仅调用计算函数但未打印返回值,程序没有输出,判题系统会直接判定错误。
  3. 除法精度隐患:使用/得到浮点数,虽然后续转int,但用整数除法//更稳妥,避免可能的精度异常。

修正后的代码

import math

def divisorSummation(inp):
    divisorsSum = 0
    if inp == 1:
        return 0

    sqrt_n = int(math.sqrt(inp))
    for i in range(1, sqrt_n + 1):
        if inp % i == 0:
            divisorsSum += i
            # 配对因数不等于原数且不等于当前i时才累加,避免平方数重复计算
            pair = inp // i
            if pair != inp and pair != i:
                divisorsSum += pair

    return divisorsSum

count = int(input())
for _ in range(count):
    num = int(input())
    print(divisorSummation(num))

关键修复点说明

  • 调整配对因数判断条件为pair != inp and pair != i:既排除了原数本身,也避免了平方数(如4,i=2时pair=2)重复累加的问题。
  • 主循环添加print语句,确保每个测试用例的计算结果被输出。
  • 用//替代/执行整数除法,保证数值始终为整数类型,避免类型转换时的意外错误。

内容的提问来源于stack exchange,提问作者Mocak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:05:28