我正在尝试将整数转换为字符串,我遇到了问题。
我已经编写了大部分代码并且正在工作,但是当它移到下一个地方时它有一个小缺陷。这很难描述,所以我给你举个例子。使用带有由小写字母组成的字符集的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);
我有一种感觉,这个函数正在绊倒模数返回零,但我一直在努力这么久,我无法弄清楚它是如何发生的。欢迎任何建议。
编辑:生成的字符串是小端的事实与我的应用程序无关。
答案 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>