程序始终输出0,Emilia Number判断函数问题排查求助
Emilia Number识别函数问题排查
核心逻辑错误:因数差的方向完全搞反
你的代码四重循环里判断条件是factors[i] + factors[j] == factors[k] - factors[l],但收集因数时是按从小到大的顺序遍历(从1到num),k < l意味着factors[k] < factors[l],此时factors[k] - factors[l]结果为负数,而两个正因数的和必然是正数,正数不可能等于负数,直接导致所有判断都不成立,函数永远返回False,最终统计结果为0。
以示例数6为例,它的因数列表是[1,2,3,6],符合定义的等式是1+2=6-3,对应代码里应该是factors[i]+factors[j] == factors[l] - factors[k](大因数减小因数),而非你写的反过来。
次要问题:代码缩进错误
原代码中for i in range(1, num+1):下方的if num % i == 0:没有缩进,这会触发Python缩进语法错误。正确写法需将if语句缩进,纳入for循环的代码块:
def is_emilia_number(num): # Find all the factors of the number factors = [] for i in range(1, num+1): if num % i == 0: # 此处必须缩进 factors.append(i) # ... 后续逻辑代码
优化建议:放宽因数组合限制
你的四重循环强制要求四个因数不同且严格递增,但Emilia Number的定义并未限制两组因数必须是四个完全不同的元素。可以修改逻辑,不强制k < l,改为遍历所有可能的两因数组合作为差的部分:
def is_emilia_number(num): factors = [] for i in range(1, num+1): if num % i == 0: factors.append(i) # 遍历所有两因数的和 for a in range(len(factors)): for b in range(a+1, len(factors)): sum_val = factors[a] + factors[b] # 遍历所有两因数的差(允许前大后小) for c in factors: for d in factors: if c != d and c - d == sum_val: return True return False
更高效的写法可以提前把所有可能的和存入集合,再遍历差去匹配:
def is_emilia_number(num): factors = [] for i in range(1, num+1): if num % i == 0: factors.append(i) sum_set = set() # 生成所有两因数的和 for a in range(len(factors)): for b in range(a+1, len(factors)): sum_set.add(factors[a] + factors[b]) # 检查是否存在符合条件的差 for c in factors: for d in factors: if c != d and (c - d) in sum_set: return True return False
修改后运行,1-1000内的Emilia Number数量会符合预期的8个。
内容的提问来源于stack exchange,提问作者yukined
相关产品推荐
相关产品推荐

