Python算法题代码调试:寻找满足条件的最小奇数N
算法题目要求
给定大于1的自然数N,按以下步骤生成新数R:
- 将N转换为二进制表示;
- 反转除首位外的所有位;
- 转换为十进制;
- 将结果与原数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实现位反转。
代码错误原因分析
- 字符串不可直接修改:Python中字符串是不可变类型,直接通过
s[i] = '1'或s[i] = 'k'修改单个字符会抛出TypeError,必须先转为列表才能修改元素。 - 索引越界:循环
for i in range(len(s))中访问s[i+1],当i等于len(s)-1时,i+1超出字符串长度,触发IndexError。且需求是反转除首位外的所有位,应从索引1开始处理后续字符,而非遍历整个字符串。 - 字符与整数比较错误:
s[i+1] == 0是将字符串字符与整数0比较,结果永远为False,需改为s[i+1] == '0'。 - 反转逻辑理解错误:用户的操作是对每一位取反(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
相关产品推荐
相关产品推荐

