2010-02-19 82 views
2

我想現在整數轉換爲一個字符串,我有一個問題。基地轉換問題

我已經完成了大部分編寫和編寫的代碼,但是在攜帶到下一個地方時它有一個小缺陷。這很難描述,所以我給你舉個例子。用基座26用由小寫字母組成的字符集:

0 = 「一」
1 = 「B」
2 = 「c」 的

...

25 =「 z「
26 =」ba「(這應該等於」aa「)

在某些情況下,它似乎在字符集的零位跳過字符。

令我困惑的是我看到我的代碼沒有錯。我一直在研究這個問題已經很久了,我仍然無法弄清楚。

char* charset = (char*)"abcdefghijklmnopqrstuvwxyz"; 
int charsetLength = strlen(charset); 

unsigned long long num = 5678; // Some random number, it doesn't matter 
std::string key 

do 
{ 
    unsigned int remainder = (num % charsetLength); 
    num /= charsetLength; 

    key.insert(key.begin(), charset[remainder]); 

} while(num); 

我有一種感覺,功能上模返回一個零絆倒了,但我一直在這這麼久了,我無法弄清楚它是如何發生的。歡迎任何建議。

編輯:事實上,生成的字符串是小endian是無關我的應用程序。

+2

旁註:您所選擇的數據類型爲什麼不是'charset'是一個const char *'?(這將消除C風格的演員陣容。)爲什麼不是'charsetlength'是一個'std :: size_t' - 這是類型通過返回'的std :: strlen的()'。如果'num'是一個'無符號長long',怎麼會(在通用平臺)除以26安裝到了'無符號int'的結果呢? – sbi 2010-02-19 06:47:53

+0

我或多或少地寫了這段代碼作爲例子,雖然你的觀點是有效的和讚賞。 – jakogut 2010-02-19 06:51:15

回答

4

如果我理解正確的話,你想要什麼(對於列使用Excel中的編號,A,B,... Z,AA,AB,...),這是一個基於符號能夠代表從1開始編號26位數字的值爲1,2,... 26,基數爲26.所以A的值爲1,Z值爲26,AA值爲27 ...計算這種表示法與您需要調整的正常再現非常相似的的1而不是0

#include <string> 
#include <iostream> 
#include <climits> 

std::string base26(unsigned long v) 
{ 
    char const digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    size_t const base = sizeof(digits) - 1; 
    char result[sizeof(unsigned long)*CHAR_BIT + 1]; 
    char* current = result + sizeof(result); 
    *--current = '\0'; 

    while (v != 0) { 
     v--; 
     *--current = digits[v % base]; 
     v /= base; 
    } 
    return current; 
} 

// for testing 
#include <cstdlib> 

int main(int argc, char* argv[]) 
{ 
    for (int i = 1; i < argc; ++i) { 
     unsigned long value = std::strtol(argv[i], 0, 0); 
     std::cout << value << " = " << base26(value) << '\n'; 
    } 
    return 0; 
} 

與1 2 26 27 52 53 676 677 702 703運行的偏移賦予

1 = A 
2 = B 
26 = Z 
27 = AA 
52 = AZ 
53 = BA 
676 = YZ 
677 = ZA 
702 = ZZ 
703 = AAA 
+0

這個例子給了我正確的我需要修復我自己的代碼,謝謝! – jakogut 2010-02-20 16:19:23

4

您的問題是「A」 == 0

換句話說,「AA」也不是辦法,因爲這確實是00「BA」是正確答案,因爲B =「1」 ,所以這使得它在十六進制中是十六進制的26。

你的代碼是正確的,你似乎誤解了它。

+0

啊,是的。這是有道理的。有想法該怎麼解決這個嗎? – jakogut 2010-02-19 06:26:03

+2

以十進制表示法而不是「00」將十個錯誤表示法修復爲「10」的方式相同。換句話說,沒有什麼可以解決的。您的代碼輸出正確的值。例如,在0 1 2 3 4 5 6 7 8 9之後,您得到10,而不是十進制的00。 – 2010-02-19 06:50:58

0

我認爲你應該做一個= 1和z = 0,所以你已經ABC ... Z就像十進制1234 ... 90

比較它十進制:9其次是10而不是01!

0

要獲得Aprogrammers解決方案來編譯我的系統上(我使用gcc版本4.6.1(Ubuntu的/ Linaro的4.6.1-9ubuntu3)我需要添加頁眉; #include <climits> #include<cstdlib>

+0

謝謝你指出。我已經爲Stuart的答案排隊編輯了這些內容。將來,當您看到類似答案的問題時,我建議您單擊「編輯」按鈕直接編輯答案,而不是發佈其他答案,以確保每個人都能看到您的更改。 – 2012-10-28 12:50:31