使用python编写十二进制与十进制转换程序

我在面试前,面试公司发来一道python题,我觉得还挺有意思的。题目如下。"""
“”"
我们知道 2 进制数字由 2 种字符(01)组成,10 进制数字由 10 种字符(0123456789)组成,16 进制由 16 种字符(0123456789ABCDEF)。不同进制的数字之间可以相互转换。

我们定义一种 “十二地支进制” 数字,这种数字由中国古代地支的 12 种字符(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)组成。“十二地支进制” 数字和 10 进制数字的关系可以看下面的代码。

 [
        ["子", 0],
        ["丑", 1],
        ["寅", 2],
        ["卯", 3],
        ["辰", 4],
        ["巳", 5],
        ["午", 6],
        ["未", 7],
        ["申", 8],
        ["酉", 9],
        ["戌", 10],
        ["亥", 11],
        ["丑子", 12],
        ["丑丑", 13],
        ["丑寅", 14],
        ["丑卯", 15],
        ["丑寅子卯", 2019],
    ]

请实现 10 进制数字和 “十二地支进制” 数字之间的转换函数。不需要考虑负数。
“”"
这道题的本质就是十进制转十二进制。跟十进制转十六进制或者八进制原理一样。十进制转二进制是“除二倒取余数法”如下图:
十进制转二进制 源自网络

与之类似,十二进制是除以十六。

十六进制转十进制的转换方式是“加权求和法”,如下图:
十六进制转十进制 图源网络
图中的十六进制数应为:713。转换后的十进制为125。

十二进制转换十进制的方法类似。十二进制是12的N次方。
在已知上述的转换方式后,该问题就解决了一大半。只需要转换为对应的“地支”数。

python代码如下:

 a = 2019#给定十进制数如
    b = []
    init_10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    dizhi1 = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
    int_to_dizhi = dict(zip(init_10, dizhi1))#地支对应的十进制字典
#十进制转换为地支

    if a >= 12:#判断是否大于12?小于12直接转换为对应地支。

        if a // 12 >= 12:
#整除12是否大于12?小于12只做一次除12,大于12会多次除以12while (a >= 12):
                c = a % 12  # 获得余数
                a = a // 12  # 循环除
                b.append(c)

            b.append(a)
        else:
            b.append(a % 12)#只做一次除12取余数
            b.append(a // 12)


    else:
        b.append(a)

    ccc=[]#输出
    b.reverse()#列表左右翻转

    for i in b:
        ccc.append(int_to_dizhi[i])#将十进制转换为对应的“地支”
    return ccc

地支进制转十进制:

init_10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    dizhi1 = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
    int_to_dizhi = dict(zip(dizhi1, init_10))

    d = ""#给定的地支如dizhi: str
    d.split()#字符串分割
    z = []
    l = len(d)
    #地支转换成十进制
    for i in list(d):
        z.append(int_to_dizhi[i])

    ten = 0
    for i, j in enumerate(z, start=0):
        ten = ten + j * 12 ** (l - i - 1)

        print(i, j)

    print(ten)
    return ten

或许不是最简单的,不过思路应该是清晰的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值