我在面试前,面试公司发来一道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会多次除以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
可能不是最简单的,但是思路应该是清晰的。
网友评论