SPOJ DIVSUM问题:正整数真因数和求解代码调试求助
SPOJ DIVSUM 题目代码调试修复
问题背景
题目要求:给定自然数n(1≤n≤500000),输出其所有真因数的和(真因数指严格小于该数的因数,例如20的真因数为1、2、4、5、10,和为22)。
原代码存在的问题
- 真因数判断逻辑错误:当i=1时,配对因数是
inp/1=inp,这个数等于原数,不属于真因数,但原代码的i !=1条件逻辑混乱,正确逻辑应该是:只要配对因数不等于原数,就加到总和里。 - 无输出结果:主循环仅调用计算函数但未打印返回值,程序没有输出,判题系统会直接判定错误。
- 除法精度隐患:使用
/得到浮点数,虽然后续转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
相关产品推荐
相关产品推荐

