使用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 进制数字和 "十二地支进制" 数字之间的转换函数。不需要考虑负数。
"""
这道题的本质就是十进制转十二进制。跟十进制转十六进制或者八进制原理一样。十进制转二进制是“除二倒取余数法”如下图:
文章图片
十进制转二进制 源自网络 与之类似,十二进制是除以十六。
十六进制转十进制的转换方式是“加权求和法”,如下图:
文章图片
十六进制转十进制 图源网络
图中的十六进制数应为: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
可能不是最简单的,但是思路应该是清晰的。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum