使用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], ]

【使用python编写十二进制与十进制转换程序】请实现 10 进制数字和 "十二地支进制" 数字之间的转换函数。不需要考虑负数。
"""
这道题的本质就是十进制转十二进制。跟十进制转十六进制或者八进制原理一样。十进制转二进制是“除二倒取余数法”如下图:

使用python编写十二进制与十进制转换程序
文章图片
十进制转二进制 源自网络 与之类似,十二进制是除以十六。
十六进制转十进制的转换方式是“加权求和法”,如下图:

使用python编写十二进制与十进制转换程序
文章图片
十六进制转十进制 图源网络
图中的十六进制数应为: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会多次除以12。 while (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

可能不是最简单的,但是思路应该是清晰的。

    推荐阅读