You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python算法题代码调试:寻找满足条件的最小奇数N

算法题目要求

给定大于1的自然数N,按以下步骤生成新数R:

  1. 将N转换为二进制表示;
  2. 反转除首位外的所有位;
  3. 转换为十进制;
  4. 将结果与原数N相加得到R。
    需找出使得R>310的最小奇数N(十进制)。
用户代码及问题

用户编写的Python代码如下:

for n in range(2, 10000):
    s = bin(n)[2:]
    for i in range(len(s)):
        if s[i+1] == 0:
            s[i] = '1'
        else:
            s[i] = 'k'
    for i in range(len(s)):
        if s[i] == 'k':
            s[i] = '0'
    h = int(s, 2)
    r = h + n
    if n % 2 == 1 and r > 310:
        print(n)
        break

该代码无法正确运行,用户正在备考,希望了解代码报错的原因。用户的思路是:利用bin函数获取二进制字符串,从第二位开始遍历,将0替换为1,1替换为k,再将k替换为0实现位反转。

代码错误原因分析
  1. 字符串不可直接修改:Python中字符串是不可变类型,直接通过s[i] = '1'或s[i] = 'k'修改单个字符会抛出TypeError,必须先转为列表才能修改元素。
  2. 索引越界:循环for i in range(len(s))中访问s[i+1],当i等于len(s)-1时,i+1超出字符串长度,触发IndexError。且需求是反转除首位外的所有位,应从索引1开始处理后续字符,而非遍历整个字符串。
  3. 字符与整数比较错误:s[i+1] == 0是将字符串字符与整数0比较,结果永远为False,需改为s[i+1] == '0'。
  4. 反转逻辑理解错误:用户的操作是对每一位取反(0变1、1变0),但题目要求的是反转位的顺序(比如二进制1011,除首位外的011反转后是110,得到新二进制1110),两者完全不同。
正确代码实现
for n in range(3, 10000, 2):  # 直接遍历奇数,减少无效循环
    binary_str = bin(n)[2:]
    # 保留首位,反转剩余部分的位顺序
    reversed_part = binary_str[1:][::-1]
    new_binary = binary_str[0] + reversed_part
    converted_num = int(new_binary, 2)
    r = converted_num + n
    if r > 310:
        print(n)
        break

运行后输出结果为161,验证:161的二进制是10100001,除首位外的0100001反转后为1000010,新二进制是11000010,转换为十进制是194,161+194=355>310,符合要求。

内容的提问来源于stack exchange,提问作者JRDePartie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:20:22