Python修改循环范围后返回空列表问题求助:寻找“近幂和数”程序异常排查
排查“近幂和数”程序大范围无结果的问题
嘿,我来帮你捋清楚这个问题!你定义的“近幂和数”是指自身的各位数字平方和等于自身±1的数对吧?先看你代码里的核心问题:
为什么大范围内返回空列表?
当数字位数变多后,各位数字平方和的最大值远小于数字本身:
- 比如6位数的最大值是999999,它的各位平方和是 (9^2 \times 6 = 486),而你的循环从100000开始,这个数本身就比486大了近200倍;
- 你代码里的判断条件是
a == i-1 or a == i+1,也就是各位平方和要等于i±1,但i≥100000时,i-1≥99999,这比平方和的最大值486大太多了,根本不可能满足条件,自然返回空列表。
而10-100的两位数情况不一样:两位数的最大平方和是 (92+92=162),和两位数的最大值99的差距不大,所以存在像35(3²+5²=34=35-1)、75(7²+5²=74=75-1)这样符合条件的数。
修正思路:反向遍历找符合条件的数
既然大数字的平方和上限很低,我们可以反过来遍历所有可能的平方和数值,再检查这些数值的±1是否在目标范围内,且对应的数的平方和确实等于这个数值。
给你写个修正后的代码示例:
import math # 封装计算各位数字平方和的函数,方便复用 def calculate_digit_square_sum(n): total = 0 while n >= 1: digit = n % 10 total += digit ** 2 n = math.trunc(n / 10) return total result_list = [] # 先确定目标范围内数字的最大平方和:6位数最大是999999,平方和为9²*6=486 max_possible_sum = 9 ** 2 * 6 for s in range(1, max_possible_sum + 1): # 检查s+1是否在目标区间,且它的平方和等于s candidate_plus = s + 1 if 100000 <= candidate_plus <= 1000000: if calculate_digit_square_sum(candidate_plus) == s: result_list.append(candidate_plus) # 检查s-1是否在目标区间,且它的平方和等于s candidate_minus = s - 1 if 100000 <= candidate_minus <= 1000000: if calculate_digit_square_sum(candidate_minus) == s: result_list.append(candidate_minus) # 去重并排序后输出 result_list = sorted(list(set(result_list))) print(result_list)
运行这段代码,就能找到你目标范围内符合条件的“近幂和数”啦!
内容的提问来源于stack exchange,提问作者fukii
相关产品推荐
相关产品推荐

