我在面试前,面试公司发来一道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
或许不是最简单的,不过思路应该是清晰的。