小编典典

任意数字计数器

algorithm

我需要一个计数器 算法 ,该算法使用任意给定的数字进行计数。

我的代码与此类似:

static char digits[] = {'x','y','z'}; /* Arbitrary number of arbitrary digits. */
int i;
for(i=0; i<100; i++) {
    printf("%s\n", get_next());
}

我的预期输出:

x
y
z
yx
yy
yz
zx
zy
zz
yxx
yxy
yxz
yyx
yyy
yyz
yzx
yzy
yzz
zxx
... and so on

如您所见,我需要用于实现get_next()功能的算法,因此使用C语言并不是重点。

编辑我为澄清目的:

我的get_next()函数 可能 与此类似:

char get_next() {
    static previous = digits[0];
    char *next_number;

    /* do something here using previous and digits[] */

    return next_number;
}

请注意,使用get_next(void)next(previous_number)next(digits, previous_number)原型的功能,产生下一个数字是不是对我很重要。

编辑II出于澄清目的:

从上面的简单示例来看,我的实际情况更加复杂,我需要一个通用解决方案,该解决方案可以处理 任意数量任意数字

数字输入示例:

static char digits[] = {'a', 'b', 'c', ... 'z', '0', '1', ...}; /* Lots of digits */
static char digits[] = {'s','t','a','c','k','o','v','e','r'};   /* Arbitrary sequence */

阅读 369

收藏
2020-07-28

共1个答案

小编典典

这很简单。您要转换为基本digit_count,然后将索引建立到数组中,而不是将数字转换为数字。

要转换为任意基数,您需要除法和余数。

这是一个比我以前使用的版本更好的版本,因为它实际上创建了一个缓冲区(而不是将其打印出来),丢弃了递归进行迭代,并且在C语言中而不是在我以前的C /
Python大杂烩中。

因为它使用静态缓冲区,所以代码不是线程安全的。另请注意,如果数量太大,则不会错误检查代码不会使缓冲区下溢。最后,它使用了一种技巧,即从末尾到末尾构建字符串,然后将指针返回缓冲区的中间,这样就不必在末尾反转数字。

char *getnum(int x)
{
    static char buffer[1024];
    int idx = 1024;

    buffer[--idx] = '\0';

    if (x == 0)
        buffer[--idx] = digits[0];
    else
    {
        while (x != 0)
        {
            buffer[--idx] = digits[x % digit_count];
            x /= digit_count;
        }
    }

    return buffer + idx;
}
2020-07-28