鱼C论坛

 找回密码
 立即注册
查看: 96|回复: 3

十进制转换二进制的函数问题

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

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

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

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)

帮忙分析一下我写的函数的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
问题分析

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

问题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
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
人工回答 求最佳

无标题.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
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
本帖最后由 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))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 00:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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