2011-02-04 42 views
4

我正在研究一個在數字基數之間轉換的程序。例如,八進制是8,十進制是10.字母AZ可以認爲是基數26.在數字基數之間轉換數字

我想將數字如「A」轉換爲0,Z轉換爲25,「AA」轉換爲27和「BA 「進入53.

在我開始編碼之前,我正在紙上做所以我理解這個過程。首先,我試圖將533轉換爲基數26.

什麼算法最適合這樣做?

+0

第一個餘數(13或N)將是右側的最後一個字母。然後你用20除以26得到20作爲餘數,所以第二個字母是U 533 - > UN – 2011-02-04 02:53:44

回答

3

您需要分配 「位」,以每個字母,如:

A = 0  N = 13 
B = 1  O = 14 
C = 2  P = 15 
D = 3  Q = 16 
E = 4  R = 17 
F = 5  S = 18 
G = 6  T = 19 
H = 7  U = 20 
I = 8  V = 21 
J = 9  W = 22 
K = 10  X = 23 
L = 11  Y = 24 
M = 12  Z = 25 

然後,你{20,13}變得UN

轉換回是UN -> {20,13} -> (20 * 26 + 13) -> 52

作爲進一步的例子,我們試試數字10163,隨機抽出空氣。

除以26,直到得到小於26的數字(即兩次),並且得到,其小數部分爲0.03402366。

乘以26,你得到與小數部分0.88461516。

26,你會得到(其實在我的計算器22.99999416,但由於初始師只有兩個步驟,我們停在這裏 - 非常輕微的不準確是由於這樣的事實,浮點數字正在四捨五入)。

所以「數字」是{15,0,23}這是「數字」PAX。哇,真巧嗎?

PAX轉換回小數,其

  P * 262 + A * 261 + X * 260

(15 * 676) + (0 * 26) + 23 
= 10140  + 0  + 23 
= 10163 
0

將20和13轉換爲代表基數爲26的符號20和13。這聽起來像你在使用字母表中的字母,那就是UN(其中A是0,Z是25)。

2

讓我們退後一步一秒鐘,並期待在小數。

「147」是什麼意思?或者說,當這樣排列的字符'1','4'和'7'表示什麼?

有10位十進制數字,在此之後,我們在第一個左邊添加另一個數字,依此類推,隨着數字的增加。所以在「9」= 9 * 1之後,我們得到「10」= 1 * 10 + 0 * 1。所以「147」是1 * 10^2 + 4 * 10 + 7 * 1 = 147。同樣,我們可以倒退 - 147/10^2 = 1,映射到字符'1'。 (147%10^2)/ 10 = 4,映射到字符'4'。 147%10 = 7,映射到字符'7'。

這個作品適用於任何基數N - 如果我們得到數字0,它映射到我們集合中的第一個字符。數字1映射到第二個字符,依此類推,直到數字N-1映射到我們的數字集中的最後一個字符。

0

你在寫什麼語言?如果你在Perl中這樣做,你可以使用我在很多年前寫的CPAN模塊Math :: Fleximal,當時我感到無聊。如果你使用的語言具有無限精度的整數,那麼生活變得更容易。所有你需要做的就是採取字符,將它們轉換成一個整數數組,然後進行計算以將其轉換爲數字。