【发布时间】:2018-10-14 21:10:05
【问题描述】:
我正在将一个整数值转换为一个三进制数(它是一个字符串)。我怀疑应该有更好的方法来减少计算量。
我的算法直接实现了长除法,将数字在十进制和任意基数之间转换。
char *get_ternary_str(int value) {
char buffer[3] = { "000" };
int dividend = value;
int i = 0;
do {
int remainder = dividend % 3;
dividend = dividend / 3;
buffer[i] = ((char)remainder + '0');
i++;
} while(dividend >= 1 && i < 3);
char temp = buffer[2];
buffer[2] = buffer[0];
buffer[0] = temp;
return buffer;
}
即使在这个例子中三进制数是 3 位数长,我的目标是让它长 n 位数。也欢迎提出如何对 n 位三进制数执行此操作的建议。
【问题讨论】:
-
您展示的函数存在三个主要问题:首先是您忘记了 C 中的
char字符串实际上称为 null-terminated 字节串。 null-terminated 位很重要,这意味着三个字符的字符串需要四个空间来包含终止符。第二个问题与前一个问题有关,因为您不会终止字符串。第三个问题是你返回一个指向buffer的第一个元素的指针,一旦函数返回buffer超出范围并实际上不复存在,留下一个杂散和无效的指针 -
@Someprogrammerdude:我认为前两个问题不是真正的问题,只要 char 数组用作 char 数组而不是 cstring(对元素而不是整个数组的操作)。
-
@CoryKramer:几乎没有其他语言像 C 和 C++ 这样在许多层面上紧密结合在一起。对我来说,他要求任何一种语言的解决方案都是完全可以的。此外,将 C 解决方案转换为 C++ 通常很简单。
-
@ErikAlapää 见this meta discussion。这两种语言在某种程度上是兼容的,但具有完全不同的库特性、习语、模式等。因此,在这两种语言中寻求答案是没有意义的,因为正确的解决方案应该只针对其中一种语言。
-
@ThomasSablik 来自问题:“我正在将整数值转换为三进制数(这是一个 String)”(强调我的)。这似乎表明返回的指针将用作字符串。