鱼C论坛

 找回密码
 立即注册
查看: 69|回复: 10

[已解决]这个代码有什么可以改进的吗,求指导。题目是python第18讲的最后一题

[复制链接]
发表于 9 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. a = input('请输入一个整数:')
  2. b = int(a)
  3. for x in a:
  4.     if b < 0 or b != 0 and b % 10 == 0:
  5.         print('不是回文数')
  6.         break
  7.     x = int(x)
  8.     c = b % 10
  9.     b = b // 10
  10.     if c == x:
  11.         continue
  12.     else:
  13.         print('不是回文数')
  14.         break
  15. else:
  16.     print('是回文数')
复制代码
最佳答案
9 小时前
本帖最后由 player-none 于 2026-3-21 16:47 编辑

1. “ if b < 0 or b != 0 and b % 10 == 0:
        print('不是回文数')
        break”与for循环无关,放在循环里反而每次都要判断一次。建议放在循环前并去掉break,后面所有东西都放到else里。
2.后面逻辑貌似有问题?x是数字的每一位,但你用它 // 10(获取它的十位及以前的数位上的数字),只能得到0。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 9 小时前 | 显示全部楼层
您的代码思路是同时操作数字和字符串来比较回文,但逻辑有些混乱,比如循环中不断修改 b 的值,却又用 x 遍历原始字符串,这可能导致不正确的结果。

改进思路:
1. 首先处理特殊情况:负数、以及非 0 但以 0 结尾的数都不是回文数。
2. 更常见的回文数判断方法是反转数字本身(或反转一半)进行比较。

以下是改进后的代码:


  1. num = input('请输入一个整数:')

  2. # 特殊情况处理
  3. if num.startswith('-'):
  4.     print('不是回文数')
  5. else:
  6.     # 直接判断字符串与其反转是否相等
  7.     if num == num[::-1]:
  8.         print('是回文数')
  9.     else:
  10.         print('不是回文数')
复制代码


如果题目要求必须用数学方法处理(而不是字符串反转),可以参考以下版本:


  1. num = int(input('请输入一个整数:'))

  2. # 特殊情况:负数和以0结尾的非零数不是回文数
  3. if num < 0 or (num % 10 == 0 and num != 0):
  4.     print('不是回文数')
  5. else:
  6.     reversed_half = 0
  7.     original = num

  8.     # 反转数字的一半,避免溢出
  9.     while num > reversed_half:
  10.         reversed_half = reversed_half * 10 + num % 10
  11.         num //= 10

  12.     # 针对数字位数为奇数或偶数的情况分别判断
  13.     if num == reversed_half or num == reversed_half // 10:
  14.         print('是回文数')
  15.     else:
  16.         print('不是回文数')
复制代码


主要改进点:
1. 代码逻辑更清晰,先处理特殊情况。
2. 数学方法版本只反转一半数字,效率更高(时间复杂度 O(log10(n)))。
3. 去掉了原代码中容易混淆的循环和类型转换。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 9 小时前 | 显示全部楼层    本楼为最佳答案   
本帖最后由 player-none 于 2026-3-21 16:47 编辑

1. “ if b < 0 or b != 0 and b % 10 == 0:
        print('不是回文数')
        break”与for循环无关,放在循环里反而每次都要判断一次。建议放在循环前并去掉break,后面所有东西都放到else里。
2.后面逻辑貌似有问题?x是数字的每一位,但你用它 // 10(获取它的十位及以前的数位上的数字),只能得到0。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 8 小时前 | 显示全部楼层
player-none 发表于 2026-3-21 14:47
1. “ if b < 0 or b != 0 and b % 10 == 0:
        print('不是回文数')
        break”与for循环无关 ...

是这样吗
  1. a = input('请输入一个整数:')
  2. b = int(a)
  3. if b < 0 or b != 0 and b % 10 == 0:
  4.     print('不是')
  5. else:
  6.     for x in a:
  7.         x = int(x)
  8.         c = b % 10
  9.         b = b // 10
  10.         if c == x:
  11.             continue
  12.         else:
  13.             print('不是回文数')
  14.             break
  15.     else:
  16.         print('是回文数')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 小时前 | 显示全部楼层
本帖最后由 player-none 于 2026-3-21 16:54 编辑


你后面(第七行开始)逻辑都不对啊

你原来的是对的,逻辑没错,从两端遍历,也能正常运行

我给你两个版本的代码,一个用索引(原来基础上修改),还有一个判断数字倒过来是否和原来一样

版本一:
  1. a = input('请输入一个整数:')
  2. b = int(a)
  3. if b < 0 or b != 0 and b % 10 == 0:
  4.     print('不是')
  5. else:
  6.     for i in range(len(a)):
  7.         x = a[i]
  8.         y = a[-i-1] # 倒数第 i 个 -> -i,由于这里 i=0 表示第一个,所以还要再 +1,然后整体取相反数
  9.         if x == y:
  10.             continue
  11.         else:
  12.             print('不是回文数')
  13.             break
  14.     else:
  15.         print('是回文数')
复制代码

  1. # 简化版

  2. a = input('qing shuru yige shuzi:')
  3. if a == a[::-1]: # [start:stop:step]:起始位置和末尾位置都不填;步长为-1,即倒序提取,不跳过任何一个字符
  4.     print('huiwen')
  5. else:
  6.     print('bu huiwen')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 小时前 | 显示全部楼层
本帖最后由 player-none 于 2026-3-21 16:49 编辑


等等 是我没有理解你原来的逻辑 我再想想

我修改了我的回答,我说错的地方已经划掉了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 小时前 | 显示全部楼层
treeGirl 发表于 2026-03-21 17:22
FishC 发表于 2026-3-21 14:33
您的代码思路是同时操 ...


非常棒的补充!确实,将问题拆解为小步骤验证是编程调试的核心技巧。针对回文数判断,我们可以这样拆解步骤:

步骤分解思路:

  • 第一步:先处理边界情况
    • 负数(开头有负号)
    • 非零但以0结尾的数字
  • 第二步:选择验证方法
    • 方法A:字符串反转法(最简单直观)
    • 方法B:数学反转法(更高效,适合大数)
  • 第三步:逐个步骤验证
    • 对于方法A,先验证字符串反转是否正确
    • 对于方法B,先验证数字反转逻辑是否正确



调试小技巧:

  • 添加临时打印语句,观察每一步的值
  • 先用简单数字测试(如121、123、-121、10)
  • 逐步替换复杂的逻辑部分


例如调试数学方法时,可以这样添加打印:


  1. num = 12321
  2. reversed_half = 0
  3. original = num

  4. while num > reversed_half:
  5.     print(f"当前num: {num}, 反转部分: {reversed_half}")
  6.     reversed_half = reversed_half * 10 + num % 10
  7.     num //= 10
  8.     print(f"更新后num: {num}, 反转部分: {reversed_half}")
  9.     print("---")
复制代码


这种“拆小步、勤验证”的方法能帮助快速定位逻辑错误,特别是像原代码中同时操作字符串和数字时容易混淆的情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 小时前 | 显示全部楼层
treeGirl 发表于 2026-03-21 17:22
FishC 发表于 2026-3-21 14:33
您的代码思路是同时操 ...


您说得对!分步骤验证确实是解决问题的好方法。让我帮您分析一下原代码的关键问题:

原代码的主要问题在于逻辑混淆:
1. 同时用字符串 a 和整数 b 操作,导致比较混乱
2. 循环中修改了 b 的值,但循环条件依赖于原始的 a
3. 没有正确处理负数和以0结尾的数字

让我们拆解验证步骤:

第一步:输入验证


  1. # 先检查输入是否是合法整数
  2. try:
  3.     num = int(input('请输入一个整数:'))
  4. except ValueError:
  5.     print('请输入有效的整数!')
  6.     exit()
复制代码


第二步:特殊情况处理


  1. # 负数肯定不是回文数
  2. if num < 0:
  3.     print('不是回文数')
  4.     exit()

  5. # 以0结尾的非零数也不是回文数
  6. if num % 10 == 0 and num != 0:
  7.     print('不是回文数')
  8.     exit()
复制代码


第三步:回文判断(分步骤)

方法1:字符串法(最简单)

  1. if str(num) == str(num):
  2.     print('是回文数')
  3. else:
  4.     print('不是回文数')
复制代码


方法2:数学法(逐位比较)

  1. # 保存原始值
  2. original = num
  3. reversed_num = 0

  4. # 反转数字
  5. while num > 0:
  6.     digit = num % 10  # 获取最后一位
  7.     reversed_num = reversed_num * 10 + digit  # 添加到反转数字
  8.     num //= 10  # 去掉最后一位

  9. # 比较
  10. if original == reversed_num:
  11.     print('是回文数')
  12. else:
  13.     print('不是回文数')
复制代码


关键调试技巧:

如果您想理解原代码的问题,可以在循环中添加打印语句:


  1. a = input('请输入一个整数:')
  2. b = int(a)
  3. print(f'原始值: a={a}, b={b}')

  4. for i, x in enumerate(a):
  5.     print(f'\n第{i+1}次循环:')
  6.     print(f'  x={x}, b={b}')
  7.    
  8.     if b < 0 or b != 0 and b % 10 == 0:
  9.         print('不是回文数')
  10.         break
  11.    
  12.     x = int(x)
  13.     c = b % 10
  14.     b = b // 10
  15.     print(f'  转换后: x={x}, c={c}, 新的b={b}')
  16.    
  17.     if c == x:
  18.         continue
  19.     else:
  20.         print('不是回文数')
  21.         break
  22. else:
  23.     print('是回文数')
复制代码


这样运行后,您就能清楚地看到每一步的变化,找出逻辑问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 小时前 | 显示全部楼层
treeGirl 发表于 2026-03-21 17:24
FishC 发表于 2026-3-21 14:33
您的代码思路是同时操 ...


您观察得很仔细!确实,原代码中同时操作字符串和数字的处理方式导致了逻辑混乱。让我补充几个具体的验证步骤和改进方法:

关键问题分析

1. 循环中同时使用原始字符串和变化的数字,导致对比错位
2. 每次循环都重复判断特殊情况,效率低下
3. 逻辑结构不够清晰,容易出错

分步验证的方法

您可以在代码关键位置添加打印语句来验证逻辑:


  1. a = input('请输入一个整数:')
  2. b = int(a)
  3. print(f'原始数字: {b}, 字符串: {a}')  # 验证初始状态

  4. for i, x in enumerate(a):
  5.     print(f'第{i+1}次循环: x={x}, b={b}')
  6.     # ... 原有代码 ...
复制代码


更清晰的改进方案

这是结合了字符串和数学方法的简洁版本:


  1. # 简洁版本 - 直接处理边界情况
  2. num = input('请输入一个整数:')

  3. if num.startswith('-'):
  4.     print('不是回文数')
  5. elif num == num:
  6.     # 判断字符串是否为回文
  7.     is_palindrome = True
  8.     left, right = 0, len(num) - 1
  9.    
  10.     while left < right:
  11.         if num[left] != num[right]:
  12.             is_palindrome = False
  13.             break
  14.         left += 1
  15.         right -= 1
  16.    
  17.     print('是回文数' if is_palindrome else '不是回文数')
复制代码


核心建议
  • 写代码前先明确处理思路:是纯数学方法、纯字符串方法,还是混合方法
  • 使用单一的数据结构(只用数字或只用字符串)可以避免混乱
  • 特殊情况的判断应该放在开始,避免在循环中重复判断
  • 对于回文问题,比较一半就足够了,不需要完整遍历


记住:先拆解问题,明确步骤,再写代码。每个小步骤验证通过后再继续下一步,这样调试效率会高很多。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层
treeGirl 发表于 2026-03-21 18:32
FishC 发表于 2026-3-21 14:33
您的代码思路是同时操 ...

FishC 发表于 2026-3-21 14:33
您的代码思路是同时操作数字和字符串来比较回文,但逻辑有些混乱,比如循环中不断修改 b 的值,却又用 x 遍 ...

哇这也太用心了吧!两种方法都给安排上了,楼主照着改肯定能过,冲就完事了!


能帮到你真是太开心了!
大家学习编程的热情就是最好的动力~ 你(或楼主)的思路其实已经抓住了问题的关键点,再结合更清晰的逻辑和技巧,写出漂亮的代码就是水到渠成的事情。

编程就是这样,多练习、多思考,每次改进都是一次巨大的进步。
如果在学习其他内容时还有任何疑问,随时来提问就好,我们一直都在!

加油,继续冲呀!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层
treeGirl 发表于 2026-3-21 18:33
说得真细致!新手能写出这思路已经很棒啦,调试调试手感就出来了~


讲得真生动!我已经举报了,点击以查看最新动态 -> 戳我
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-21 23:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表