我在面試前,面試公司發(fā)來一道python題,我覺得還挺有意思的。題目如下。"""
“”"
我們知道 2 進制數(shù)字由 2 種字符(01)組成,10 進制數(shù)字由 10 種字符(0123456789)組成,16 進制由 16 種字符(0123456789ABCDEF)。不同進制的數(shù)字之間可以相互轉(zhuǎn)換。
我們定義一種 “十二地支進制” 數(shù)字,這種數(shù)字由中國古代地支的 12 種字符(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)組成。“十二地支進制” 數(shù)字和 10 進制數(shù)字的關(guān)系可以看下面的代碼。
[
[
"子"
,
0
]
,
[
"丑"
,
1
]
,
[
"寅"
,
2
]
,
[
"卯"
,
3
]
,
[
"辰"
,
4
]
,
[
"巳"
,
5
]
,
[
"午"
,
6
]
,
[
"未"
,
7
]
,
[
"申"
,
8
]
,
[
"酉"
,
9
]
,
[
"戌"
,
10
]
,
[
"亥"
,
11
]
,
[
"丑子"
,
12
]
,
[
"丑丑"
,
13
]
,
[
"丑寅"
,
14
]
,
[
"丑卯"
,
15
]
,
[
"丑寅子卯"
,
2019
]
,
]
請實現(xiàn) 10 進制數(shù)字和 “十二地支進制” 數(shù)字之間的轉(zhuǎn)換函數(shù)。不需要考慮負數(shù)。
“”"
這道題的本質(zhì)就是十進制轉(zhuǎn)十二進制。跟十進制轉(zhuǎn)十六進制或者八進制原理一樣。十進制轉(zhuǎn)二進制是“除二倒取余數(shù)法”如下圖:
與之類似,十二進制是除以十六。
十六進制轉(zhuǎn)十進制的轉(zhuǎn)換方式是“加權(quán)求和法”,如下圖:
圖中的十六進制數(shù)應(yīng)為:713。轉(zhuǎn)換后的十進制為125。
十二進制轉(zhuǎn)換十進制的方法類似。十二進制是12的N次方。
在已知上述的轉(zhuǎn)換方式后,該問題就解決了一大半。只需要轉(zhuǎn)換為對應(yīng)的“地支”數(shù)。
python代碼如下:
a
=
2019
#給定十進制數(shù)如
b
=
[
]
init_10
=
[
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
]
dizhi1
=
[
"子"
,
"丑"
,
"寅"
,
"卯"
,
"辰"
,
"巳"
,
"午"
,
"未"
,
"申"
,
"酉"
,
"戌"
,
"亥"
]
int_to_dizhi
=
dict
(
zip
(
init_10
,
dizhi1
)
)
#地支對應(yīng)的十進制字典
#十進制轉(zhuǎn)換為地支
if
a
>=
12
:
#判斷是否大于
12
?小于
12
直接轉(zhuǎn)換為對應(yīng)地支。
if
a
// 12 >= 12:
#整除
12
是否大于
12
?小于
12
只做一次除
12
,大于
12
會多次除以
12
。
while
(
a
>=
12
)
:
c
=
a
%
12
# 獲得余數(shù)
a
=
a
// 12 # 循環(huán)除
b
.
append
(
c
)
b
.
append
(
a
)
else
:
b
.
append
(
a
%
12
)
#只做一次除
12
取余數(shù)
b
.
append
(
a
// 12)
else
:
b
.
append
(
a
)
ccc
=
[
]
#輸出
b
.
reverse
(
)
#列表左右翻轉(zhuǎn)
for
i
in
b
:
ccc
.
append
(
int_to_dizhi
[
i
]
)
#將十進制轉(zhuǎn)換為對應(yīng)的“地支”
return
ccc
地支進制轉(zhuǎn)十進制:
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
)
#地支轉(zhuǎn)換成十進制
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
或許不是最簡單的,不過思路應(yīng)該是清晰的。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
