求小于10000的数字回文数之和的Python代码问题排查
问题排查:小于10000的数字回文数求和错误
用户需要计算所有小于10000的数字回文数之和(回文数定义为正读反读一致的数,如10801),但编写的Python代码无论是否统计单数字回文数,得到的535041和534996都不符合预期,以下是错误排查和修正方案:
用户原代码
def is_numeric_palindrome(number): """ :param number: an integer :return: true if number is a numeric palindrome """ number_as_string = str(number) number_digit_length = len(number_as_string) for i in range(0, int(number_digit_length / 2)): # print(i) # print(f"number_as_string[i]={number_as_string[i]}," # f" number_as_string[:i]={number_as_string[number_digit_length - i - 1]}") if not number_as_string[i] is number_as_string[number_digit_length - i - 1]: return False return True def sum_numeric_palindromes(upper_limit): """ :param upper_limit: maximum number :return: the sum of all numeric palindrome between 0 and upper_limit (upper_limit not included) """ palindrome_sum = 0 # upper limit not included for i in range(0, upper_limit - 1): if is_numeric_palindrome(i): palindrome_sum += i return palindrome_sum
错误点分析
字符比较方式错误:
is用于比较对象的身份而非值,虽然短字符串可能因Python的缓存机制偶然生效,但这不是正确的数值比较方式,应替换为==。遍历范围错误:
题目要求统计小于10000的数,即包含0到9999所有数。range(0, upper_limit - 1)会导致最后一个数9999被漏掉(因为range是左闭右开),正确的范围应该是range(0, upper_limit)。
修正后的代码
def is_numeric_palindrome(number): """ 判断整数是否为数字回文数 :param number: 待判断的整数 :return: 是回文数返回True,否则返回False """ number_as_string = str(number) length = len(number_as_string) for i in range(length // 2): if number_as_string[i] != number_as_string[length - i - 1]: return False return True def sum_numeric_palindromes(upper_limit): """ 计算0到upper_limit(不包含)之间所有回文数的和 :param upper_limit: 上限值 :return: 回文数总和 """ palindrome_sum = 0 for i in range(upper_limit): if is_numeric_palindrome(i): palindrome_sum += i return palindrome_sum # 测试:计算小于10000的回文数之和 print(sum_numeric_palindromes(10000)) # 正确输出:535050
正确结果验证
所有小于10000的回文数总和为535050,拆分计算如下:
- 单数字回文数(0-9):和为45
- 两位数回文数(11,22,...,99):和为495
- 三位数回文数:和为49500
- 四位数回文数:和为495000
- 总和:45+495+49500+495000=535050
内容的提问来源于stack exchange,提问作者alainsanguinetti
相关产品推荐
相关产品推荐

