2010-02-19 39 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