2015-10-14 65 views
1

我一直試圖使用PHP將非常大的整數編碼爲大寫字母序列。將0到25的值分配給A〜Z我已經將10億縮減爲DGEHTYM。如果實現一個工作算法,使用不同的情況,數字和偶數符號,結果字符串可能會更短。然而,我的目標只是一串大寫字母,或許也帶有數字字符,以使其縮短但不是必須的。將非常大的數字編碼爲字符串

編碼使用的筆,紙,我的手機上的計算器:

  • 找到超過十億(PHP具有的功能log爲)更低的最高功率。對於10億是6。所以26^6 = 308,915,776
  • 十億通過是3.237有很多小數
  • 的是d。我們有我們的第一封信!
  • 現在我們將一遍又一遍地做同樣的事情,直到我們得到一個整數:拿走整個部分並乘以左邊的小數。我們每一個整體都是一封信。爲10億我打了6次,直到我得到12,這是M

也許有一個更聰明的方法來完成這個,但我還沒有弄明白。

也許我應該有所不同,但由於缺乏一個更好的辦法,我試圖複製我的計算在PHP做了,但我有問題:1:這是非常困難的編碼編碼將與結束數A(0)如這將是BZA和2:我無法設法讓PHP檢測數字是否有小數。我必須不斷將它轉換成一個字符串並尋找一個點。

解碼字符串比較容易。從從右到左,您可以通過26提升到其位置的功率乘以每個字母的價值,除了第一個,他們總結這一切:

D => 3 x (26^6) = 926,747,328 
G => 6 x (26^5) = 71,288,256 
E => 4 x (26^4) = 1,827,904 
H => 3 x (26^3) = 123,032 
T => 19 x (26^2) = 12,844 
Y => 24 x 26 = 624 
M => 12 
926,747,328 + 71,288,256 + 1,827,904 + 123,032 + 12,844 + 624 + 12 = 1,000,000,000 

也存在類似的問題here但這些誰回答似乎不瞭解OP正在嘗試完成什麼。

+0

所以基本上,你要很長的base10數字轉換爲base26,對不對?結果如何實現有沒有關係? –

+0

是的。不,只要結果只是大寫字母,如何實現它並不重要。 –

回答

1

您正在從基數10轉換爲26,這是在base_convertgmp_strval等內置函數可以處理的範圍內。他們會以0-9和a-p的形式給出數字,所以您只需要將這些數字翻譯成strtr後的數字。

$translate = array_combine(
    array_merge(range(0, 9), range('a', 'p')), 
    range('A', 'Z') 
); 

echo strtr(base_convert(1000000000, 10, 26), $translate), "\n"; 
echo strtr(base_convert(1326, 10, 26), $translate), "\n"; 

//Or if you're working with really big numbers (beyond PHP_INT_MAX): 
echo strtr(gmp_strval(1000000000, 26), $translate), "\n"; 
echo strtr(gmp_strval(1326, 26), $translate); 

輸出:

DGEHTYM 
BZA 
DGEHTYM 
BZA 

或者做手工,which'll可以很容易地添加/刪除針對不同的基地和編碼符號。基本上,您可以將輸入號碼除以基數,使用餘數查找該位置的相應符號,然後重複除法結果。

function base10_to_whatevs($num, array $digits) 
{ 
    $result = ''; 
    $base = count($digits); 
    while ($num > 0) { 
     $remainder = $num % $base; 
     $num = ($num - $remainder)/$base; 
     $result = $digits[$remainder] . $result; 
    } 
    return $result; 
} 

$letters = range('A', 'Z'); 
echo base10_to_whatevs(1000000000, $letters), "\n"; 
echo base10_to_whatevs(1326, $letters); 
DGEHTYM 
BZA 
+0

你寫的功能正是我一直在尋找的功能。我不得不做一些Google搜索來理解'$ num%$ base'位。一旦我做了這一切都有道理。它證實了我的理論,即我的PHP方法並不是最好的,並且有更高效的方法來實現相同的結果。謝謝 ;-) –

相關問題