# 轉換進位制練習 在數學上如何轉換進制? > 將商一直除下去直到商是0 > e.g. **100(十進位)轉到二進位** 100/2 ==50...0 50/2 == 25...0 25/2 == 12...1 12/2 == 6...0 6/2 == 3...0 3/2 == 1...1 1/2 == 0...1 由下往上取 == 1100100 所以遞迴的主要功能就是 ***" 記錄下餘數 "*** --- ## 十進位N,轉R進位( 遞迴 ) 十進位轉5進位: > 輸入 : 28 (N=28) > 輸出 : 103(R=5) ### python ```python= def T(N,R): if N==0: return "0" if N==1: return "1" else: return T(N//R,R)+str(N%R) print(28,5) ``` 遞迴解析: ```python= five(28) = five(5) + "3" five(5) = five(1) + "0" five(1) = "1" ``` --- ### C++ ```Cpp= string f(int N ,int R){ if (N == 0) { return "0"; } if (N ==1){ return "1"; } else{ return f(N /R) +to_string(N%R); } } ``` --- ## 餘數大於10 如果我要把255轉換到16進制 在做除法時會發現 255/16 == 15...15 如果我們將餘數記錄下來會產生錯誤 所以我們還要再多一個判斷 > 如果餘數>10,要轉成chr() ### 元想法 **python:** ```python= return T(N // R, R) + (str(N % R) if N % R < 10 else chr(N % R - 10 + ord('A'))) ``` :::danger 但是這樣會導致 ```python= twelve(24) = twelve(2) + "0" twelve(2) = twelve(0) + "2" twelve(0) = "0" ``` 結果輸出020 ::: # 10進位轉到n進位,且n>10 這時用建表的方式會比較快 ```python= def T(N, R): if N == 0: return "0" ANS = "" digits = "0123456789ABCDEF" while N > 0: ANS = digits[N % R] + ANS N = N // R return ANS ```