效果
代碼
1.字母和數(shù)字轉(zhuǎn)換
A ? 10 , B ? 11 , . . . , Z ? 35 A?10,B?11,...,Z?35 A ? 1 0 , B ? 1 1 , . . . , Z ? 3 5
def
trans
(
num
)
:
# 輸入數(shù)字換為字母或輸入字母轉(zhuǎn)換為數(shù)字
if
type
(
num
)
==
int
:
if
num
<
10
:
return
str
(
num
)
else
:
return
chr
(
ord
(
'A'
)
+
num
-
10
)
else
:
if
num
.
isdigit
(
)
:
return
int
(
num
)
else
:
return
ord
(
num
)
-
ord
(
'A'
)
+
10
2.輸入預(yù)處理
包含輸入合法性檢查,轉(zhuǎn)換字符串,改大寫(xiě),去除前導(dǎo)0
def
check
(
num
,
base
,
target
)
:
# 待轉(zhuǎn)換數(shù)字,當(dāng)前進(jìn)制,目標(biāo)進(jìn)制
if
type
(
base
)
is
not
int
or
base
<
2
or
base
>
36
or
type
(
target
)
is
not
int
or
target
<
2
or
target
>
36
:
print
(
'非法進(jìn)制數(shù)!'
)
return
False
if
type
(
num
)
is
int
or
type
(
num
)
is
float
:
num
=
str
(
num
)
.
upper
(
)
elif
type
(
num
)
is
str
and
len
(
num
)
!=
0
:
num
=
num
.
upper
(
)
else
:
print
(
'非數(shù)字輸入!'
)
return
False
if
num
.
count
(
'.'
)
>
1
:
print
(
'多個(gè)小數(shù)點(diǎn)!'
)
return
False
if
not
num
.
replace
(
'.'
,
''
)
.
isalnum
(
)
:
print
(
'含有其他字符!'
)
return
False
for
c
in
num
.
replace
(
'.'
,
''
)
:
if
trans
(
c
)
>=
base
:
print
(
'字符超過(guò)進(jìn)制允許!'
)
return
False
while
len
(
num
)
>
1
:
if
num
[
0
]
==
'0'
and
num
[
1
]
!=
'.'
:
num
=
num
[
1
:
]
else
:
break
return
num
3.進(jìn)制轉(zhuǎn)換
以十進(jìn)制為中介,實(shí)現(xiàn)各進(jìn)制之間轉(zhuǎn)換。整數(shù)部分小數(shù)部分分別處理,盡可能地保證精度。
def
basechange
(
num
,
base
,
target
,
precision
=
17
)
:
# 待轉(zhuǎn)換數(shù)字,當(dāng)前進(jìn)制,目標(biāo)進(jìn)制,精度
num
=
check
(
num
,
base
,
target
)
if
num
is
False
:
return
None
point
=
num
.
find
(
'.'
)
if
point
==
-
1
:
point
=
len
(
num
)
radix
=
num
.
replace
(
'.'
,
''
)
if
target
==
10
:
int_part
=
radix
[
:
point
]
[
:
:
-
1
]
frac_part
=
radix
[
point
:
]
s
=
0
ss
=
0
for
i
in
range
(
len
(
int_part
)
)
:
s
+=
trans
(
int_part
[
i
]
)
*
base
**
i
for
i
in
range
(
len
(
frac_part
)
)
:
ss
+=
trans
(
frac_part
[
i
]
)
/
base
**
(
i
+
1
)
return
str
(
s
)
+
str
(
ss
)
[
1
:
]
elif
base
==
10
:
int_part
=
int
(
radix
[
:
point
]
)
frac_part
=
float
(
'0.'
+
radix
[
point
:
]
)
s
=
''
while
True
:
s
+=
trans
(
int_part
%
target
)
int_part
//=
target
if
int_part
==
0
:
break
s
=
s
[
:
:
-
1
]
if
frac_part
!=
0
:
s
+=
'.'
ct
=
0
while
frac_part
!=
0
and
ct
<
precision
:
frac_part
*=
target
s
+=
trans
(
int
(
frac_part
)
)
frac_part
-=
int
(
frac_part
)
ct
+=
1
return
s
else
:
return
basechange
(
basechange
(
num
,
base
,
10
,
precision
=
precision
)
,
10
,
target
,
precision
=
precision
)
4.存在問(wèn)題
由于浮點(diǎn)數(shù)在計(jì)算機(jī)中不能精確儲(chǔ)存,所以對(duì)小數(shù)進(jìn)行進(jìn)制轉(zhuǎn)換時(shí),會(huì)有十分微小的誤差。如圖所示:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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