2011-04-05 62 views

回答

18

長名單here

/* 
* Convert an integer to a string of uppercase letters (A-Z, AA-ZZ, AAA-ZZZ, etc.) 
*/ 
function num2alpha($n) 
{ 
    for($r = ""; $n >= 0; $n = intval($n/26) - 1) 
     $r = chr($n%26 + 0x41) . $r; 
    return $r; 
} 

/* 
* Convert a string of uppercase letters to an integer. 
*/ 
function alpha2num($a) 
{ 
    $l = strlen($a); 
    $n = 0; 
    for($i = 0; $i < $l; $i++) 
     $n = $n*26 + ord($a[$i]) - 0x40; 
    return $n-1; 
} 
+2

+1。儘管您需要從num2alpha中的初始值$ n中減去1,而不是在alpha2num中最後減去1,以便與OP的規範1 = A相匹配。 – 2011-04-05 15:44:11

+0

良好的調用代碼是直接從php .net網站作爲一個很好的參考概念 – Kelly 2011-04-05 15:48:16

+0

爲什麼它不適用於這樣的大數字:num2alpha(20160504123435)? – Alqin 2016-05-30 14:50:22

0

那麼,你幾乎從基數10轉換爲基數26.基數10有數字0-9,而基數26可以用「數字」A-Z表示。從10號基地轉換很容易 - 請參閱這個: http://www.mathsisfun.com/base-conversion-method.html 編輯:實際上,base-26無法解釋多個寫入0(0 = 00 = 000)的等價方法。

+0

不,不是。說,「數字」A相當於「數字」1,B是2,依此類推。所以我們有1,2,3,4,...,Z,11,12,13,...,1Z,21。不好。好的,我們試試A = 0,B = 1等。我們有0,1,2,3,4,...,Z,00,01,02,...,0Z,10。不,根本不是26。 – 2011-04-05 15:37:16

+0

@Martinho Fernandes:我沒有說基數爲36,也沒有0-9 + A-Z;你似乎正在使用它。請問,從A到Z英語字母表中有多少個字母?上次我查了一下,其中有26個。 A = 1,B = 2,C = 3,...,X = 24,Y = 25,Z = 26,AA = 27(26^1 * A + 26^0 *^1 * A + 26^0 * A),AC = 29,AD = 30等等等等。您可能被base-16弄糊塗了,它使用0-9 + AF,這是一個稍微不同的情況。 – Piskvor 2011-04-05 15:49:50

+0

您錯過了我的觀點:1,2,3,4,...,<最後一位是>,11,12,13。你錯過了數字「10」(又名26)!在26位數中,26位有**兩位**,就像第2位的2位和第10位的10位。 – 2011-04-05 15:51:57

0

你將不得不使用base_convert到您的數字轉換成26個鹼基:

base_convert(35, 10, 26); 

這讓你從1 - p在數量上的各個組件,所以35變成19(1 * 26 + 9)。然後,您必須將各個組件映射到您所需的組,因此1 => a,9 => i,a => j等,並且19變爲ai

+0

+1有趣的解決方案 – Wh1T3h4Ck5 2011-04-05 15:46:27

+1

問題是,26 => 1 * 26 + 0 => 10以26爲底。哎呀,您如何映射0?不,這種Excel-ish計數**不是基於26 **。 – 2011-04-05 15:48:12

+0

@Martinho Fernandes有趣的是,你是對的,根本就沒有基地。我不知道OP是如何佔0 ... – jeroen 2011-04-05 15:57:54

6

我會添加這個答案來總結關於26基地的濫用的意見。

當遇到這個問題時,常見的第一反應是想想「有26個字母,所以這必須是26位!我需要做的就是將每個字母映射到其相應的數字」

但這不是26位數。很容易看出原因:沒有零!

在base-26中,第二十六個數字是第一個有兩位數字的數字,寫成「10」。在這個計數系統中,二十六個有一個數字,「Z」,第一個兩位數字是二十七個。

但是如果我們使A = 0,...,Z = 25?這樣我們有一個零,第一個兩位數字變成二十六。到現在爲止還挺好。我們現在怎麼寫二十六個?那是「AA」。但是...不是A = 0?哎呀! A = AA = AAA =「0」=「00」=「000」。

+0

好點。很重要的一點。 – sawa 2011-04-05 18:44:16

+0

只是想把這個包裹起來。如果A = 0,26不會是BA,而是AA。 – Paystey 2012-04-18 15:41:29

+0

@Paystey是的,如果*這是基數26 *。但是這個方案中25(Z)後面的數字是AA。 – 2012-04-18 15:58:43

0
void convert(int number) 
{ 

     string str = ""; 

    while(number) 
    { 
     char ch; 
     ch = (number - 1) % 26 + 65;  
     str = ch + str; 
     number = (number-1)/26; 
    } 

    cout << str << endl; 
} 
相關問題