鱼C论坛

 找回密码
 立即注册
查看: 282|回复: 4

[已解决]十进制转换二进制的函数问题

[复制链接]
发表于 2025-5-7 16:45:40 | 显示全部楼层 |阅读模式

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

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

x
关于把十进制转化为二进制的函数,

这是小甲鱼的函数
def Dec2Bin(dec):
    temp = []
    result = ''

    while dec:
        quo = dec % 2
        dec = dec // 2
        temp.append(quo)

    while temp:
        result += str(temp.pop())

    return result

print(Dec2Bin(62))

这是我写的函数
def bins(x):
    list1 = []
    while x//2 > 0:
        list1.append(x%2)
        x = x//2
    list1.append(1)
    str1 = str()
    for each in list1:
        str1 = str(each) + str1
    return(str1)

帮忙分析一下我写的函数的问题
最佳答案
2025-5-7 17:30:56
人工回答 求最佳

无标题.png

先小小说一句,Python 有自带的 10 -> 2 函数:

  1. print(bin(100))     # 打印 0b______(当然也有可能是负数,这里不考虑)
  2. print(bin(100)[:2]) # 去掉 0b
复制代码


在运行你的代码后,观察到以下现象:

  1. >>> bins(0)
  2. '1'
复制代码


这明显不对。通过注释掉这一行:list1.append(1) 并分析得出它用于加上数字最左边那个1,就是说你的程序完全可以处理所有正整数,就是在 0 这里出现问题了。

这行代码可以改成:

  1. list1.append(bool(x) * 1)
复制代码


完整

  1. def bins(x):
  2.     list1 = []
  3.     while x//2 > 0:
  4.         list1.append(x%2)
  5.         x = x//2
  6.     list1.append(bool(x)*1)
  7.     str1 = str()
  8.     for each in list1:
  9.         str1 = str(each) + str1
  10.     return(str1)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-5-7 16:50:54 | 显示全部楼层
问题分析

你的函数和小甲鱼的函数逻辑接近,但存在两个关键问题:

问题1:未处理输入为0的情况
当输入 x=0 时,你的函数会直接添加 1 导致返回错误结果 '1',正确结果应为 '0'

问题2:循环结束后的错误补位
你固定添加了 1,但实际上应该添加 x%2 的当前值。例如当输入 x=0 时,0%2=0,此时应补0而非1

修正方案

  1. def bins(x):
  2.     if x == 0:  # 处理输入为0的特殊情况
  3.         return '0'
  4.    
  5.     list1 = []
  6.     while x//2 > 0:
  7.         list1.append(x%2)
  8.         x = x//2
  9.    
  10.     list1.append(x%2)  # 改为动态计算余数
  11.    
  12.     str1 = ''
  13.     for each in list1:
  14.         str1 = str(each) + str1  # 倒序拼接
  15.    
  16.     return str1
复制代码


改进说明
  • 增加对 x=0 的直接判断
  • 将固定补1改为 x%2 动态计算
  • 测试案例:输入62时,输出 111110(与小甲鱼函数一致)


验证代码

  1. print(bins(0))   # 输出 0
  2. print(bins(1))   # 输出 1
  3. print(bins(62))  # 输出 111110
复制代码


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

使用道具 举报

发表于 2025-5-7 17:30:56 | 显示全部楼层    本楼为最佳答案   
人工回答 求最佳

无标题.png

先小小说一句,Python 有自带的 10 -> 2 函数:

  1. print(bin(100))     # 打印 0b______(当然也有可能是负数,这里不考虑)
  2. print(bin(100)[:2]) # 去掉 0b
复制代码


在运行你的代码后,观察到以下现象:

  1. >>> bins(0)
  2. '1'
复制代码


这明显不对。通过注释掉这一行:list1.append(1) 并分析得出它用于加上数字最左边那个1,就是说你的程序完全可以处理所有正整数,就是在 0 这里出现问题了。

这行代码可以改成:

  1. list1.append(bool(x) * 1)
复制代码


完整

  1. def bins(x):
  2.     list1 = []
  3.     while x//2 > 0:
  4.         list1.append(x%2)
  5.         x = x//2
  6.     list1.append(bool(x)*1)
  7.     str1 = str()
  8.     for each in list1:
  9.         str1 = str(each) + str1
  10.     return(str1)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-7 21:51:08 | 显示全部楼层
本帖最后由 jackz007 于 2025-5-8 01:07 编辑

    由于这一句存在逻辑问题
  1. while x // 2 :
复制代码

    导致在本例情形下,必须专门添加这条语句:
  1. list1.append(1)
复制代码

    才能使结果正确,这是完全没有道理的。
    只要把问题语句改为:
  1. while x :
复制代码

    就不再需要那条专门添加的语句了

    下面的代码谨供楼主参考
  1. def bins(x):
  2.     bs = ''
  3.     while x :
  4.         bs , x = str(x % 2) + bs , x // 2
  5.     return '0b' + bs
  6. print(bins(62))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
player-none + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-12 08:51:54 | 显示全部楼层
用户编写的bins函数在处理十进制转二进制时存在以下问题:

1. 无法正确处理输入为0的情况
当输入x=0时,函数会错误地返回"1",而正确结果应为"0"。

原因:循环条件x//2 > 0在x=0时直接跳过循环,随后强制添加1到列表中。

修复:在函数开头添加对x=0的特殊判断。

2. 循环条件不严谨,导致依赖手动补余数
原循环条件while x//2 > 0仅当x >= 2时才执行循环,这导致:

余数收集不完整:最后一次除法后的余数(即最高位)需手动添加1,但此逻辑仅适用于x > 0的情况。

示例错误:若输入x=1,循环不会执行,手动添加1虽然正确,但逻辑脆弱。

正确做法:应像小甲鱼的函数一样,使用while x > 0确保所有余数被收集,无需手动补位。

3. 字符串拼接逻辑冗余
用户通过逆序拼接列表元素生成二进制字符串,但代码可优化:

直接逆序遍历列表或使用pop()更简洁。

修复后的代码
  1. def bins(x):
  2.     if x == 0:
  3.         return "0"  # 直接处理x=0的情况
  4.     list1 = []
  5.     while x > 0:    # 修正循环条件,确保所有余数被收集
  6.         list1.append(x % 2)
  7.         x = x // 2
  8.     # 逆序拼接列表元素
  9.     return ''.join(str(each) for each in reversed(list1))
复制代码

评分

参与人数 1荣誉 -2 鱼币 -2 收起 理由
player-none -2 -2 论坛不允许照搬ai答案

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-4 21:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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