面試 演算法 任意進製整數 小數間的轉換

2021-10-24 06:53:25 字數 3185 閱讀 3429

原理比較簡單,參考注釋即可理解,僅作筆記用於速查。

1. 10進製轉為n進製
不斷對n取餘作為該位上的n進製值即可。

def

ten2n_int

(num:

int, n:

int)

->

str:

# 10進製轉為n進製

if num ==0:

return

"0" res =

"" pos = num >

0# 是否為正數

num =

abs(num)

while num >0:

num, r =

divmod

(num, n)

# aka: num //= n; r = num % r;

res +=

chr(r -10+

97)if r >=

10else

chr(r +48)

return(""

if pos else

"-")

+ res[::

-1]

2. n進製轉為10進製
從頭往後,不斷將當前位的n進製數乘以相應的n進製基數,累計到10進製結果上即可。

def

n2ten_int

(num:

str, n:

int)

->

int:

# n進製轉為10進製,預設進製不超過36(即'z'+10)

if num =="":

return

0 num.lower(

)# 預設都採用小寫表示

res, pos =0,

bool

(num[0]

!='-')if

not pos:

# 如果是負數,刪去開頭的 '-' 字元

num = num[1:

] base = n **

len(num)

for i in

range

(len

(num)):

base //= n # ord('a') = 97, ord('0') = 48 | base 是當前的基數

res +=((

ord(num[i])-

97+10)

if num[i]

.isalpha(

)else

(ord

(num[i])-

48))* base

return res *(1

if pos else-1

)

3. n進製轉為m進製
直接使用取巧的方式,進製通過n->10->m進行變換即可,否則需要編寫基於m進製的加法。

def

n2m_int

(num:

str, n:

int, m:

int)

->

str:

# n進製轉為m進製

return ten2n_int(n2ten_int(num, n)

, m)

# 借助10進製完成任意進製間的轉換

1. 10進製小數轉為n進製小數
不斷乘進製數,取整數字作為當前位的值,直至小數部分為0。

def

ten2n_float

(num:

float

, n:

int, max_len:

int=5)

->

str:

assert

0<

abs(num)

<1#

res, pos =

"0."

, num >

0 num =

abs(num)

while num >

0and

len(res)-2

<= max_len:

num *= n

num, c = math.modf(num)

c =int(c)

res +=

chr(c -10+

97)if c >=

10else

chr(c +48)

return(""

if pos else

"-")

+ res

2. n進製小數轉為10進製小數
跟jn進製整數轉10進製整數一樣的套路。

def

n2ten_float

(num:

str, n:

int)

->

int:

# num like "0.***"

res, pos =

0, num[0]

!='-'

num = num[2:

]if pos else num[3:

] base =

1.0for i in

range

(len

(num)):

base /= n

res +=((

ord(num[i])-

97+10)

if num[i]

.isalpha(

)else

(ord

(num[i])-

48))* base

return res *(1

if pos else-1

)

3. n進製小數轉m進製小數
def

n2m_float

(num:

str, n:

int, m:

int)

->

str:

# n進製轉為m進製小數

return ten2n_float(n2ten_float(num, n)

, m)

# 借助10進製完成任意進製間的轉換

大整數任意進製轉換

include include include include using namespace std char str 1000 輸入字串 int start 1000 ans 1000 res 1000 被除數,商,餘數 轉換前後的進製 static int oldbase static int...

面試演算法題

前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...

面試演算法記錄

1.親和數問題 求500萬以內的所有親和數 如果兩個數a和b,a的所有真因數之和等於b,b的所有真因數之和等於a,則稱a,b是一對親和數。例如220和284,1184和1210,2620和2924。思路 220 1 2 4 71 142 sum 284 284 1 2 4 5 10 11 20 22...