基本转换问题

时间:2010-02-19 06:15:55

标签: c++ modulo base itoa

我正在尝试将整数转换为字符串,我遇到了问题。

我已经编写了大部分代码并且正在工作,但是当它移到下一个地方时它有一个小缺陷。这很难描述,所以我给你举个例子。使用带有由小写字母组成的字符集的base 26:

0 =“a”
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);

我有一种感觉,这个函数正在绊倒模数返回零,但我一直在努力这么久,我无法弄清楚它是如何发生的。欢迎任何建议。

编辑:生成的字符串是小端的事实与我的应用程序无关。

4 个答案:

答案 0 :(得分:4)

你的问题是'a'== 0。

换句话说,'aa'不是答案,因为那确实是00.'ba'是正确答案,因为b ='1',所以它在基数26中为10,即十进制为26。

你的代码是正确的,你似乎只是误解了它。

答案 1 :(得分:4)

如果我正确理解了你想要的东西(excel用于列,A,B,...... Z,AA,AB,......的编号),这是一个能够代表从1开始的数字的基础符号。数字的值为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

答案 2 :(得分:0)

我认为你应该使a = 1和z = 0所以你有abc ... z就像在十进制1234 ... 90

将它与十进制比较:9后跟10而不是01!

答案 3 :(得分:0)

要让Aprogrammers解决方案在我的系统上编译(我使用gcc版本4.6.1(Ubuntu / Linaro 4.6.1-9ubuntu3)我需要添加标题; #include <climits> #include<cstdlib>