任意数字计数器
我需要一个计数器算法,它使用任意给定的数字进行计数。
我的代码与此类似:
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 语言不是重点。
出于澄清目的编辑 I:
我的 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 */
I need a counter algortihm which use arbitrary given digits for counting purpose.
My code is similar to this:
static char digits[] = {'x','y','z'}; /* Arbitrary number of arbitrary digits. */
int i;
for(i=0; i<100; i++) {
printf("%s\n", get_next());
}
My expected output:
x
y
z
yx
yy
yz
zx
zy
zz
yxx
yxy
yxz
yyx
yyy
yyz
yzx
yzy
yzz
zxx
... and so on
As you see, I need algorithm for implementing get_next()
function, so using C language is not the point.
Edit I for clarification purpose:
My get_next() function may similar to this:
char get_next() {
static previous = digits[0];
char *next_number;
/* do something here using previous and digits[] */
return next_number;
}
Note that using get_next(void)
or next(previous_number)
or next(digits, previous_number)
prototype for your function which generates next number is not important for me.
Edit II for clarification purpose:
My real scenario is more complex from the simple example above, I need a generic solution that works with arbitrary number of arbitrary digits.
Example digit inputs:
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 */
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这很简单。您想要转换为基本的digit_count,然后不是将数字转换为数字,而是索引到数组中。
要转换为任意基数,您需要除法和余数。
这是一个比我之前使用的版本更好的版本,因为它实际上创建了一个缓冲区(而不是将其打印出来),放弃了迭代递归,并且使用 C 语言而不是我之前的 C/Python 大杂烩。
因为它使用静态缓冲区,所以代码不是线程安全的。另请注意,如果数字太大,则不会进行错误检查以确保代码不会使缓冲区下溢。最后,它使用了从末尾到前面构建字符串并返回指向缓冲区中间的指针的技巧,因此不必反转末尾的数字。
It's quite simple. You want to convert into base digit_count and then instead of converting the digits to numbers, you index into your array.
To convert to an arbitrary base, you need division and remainder.
Here's a better version than what I used before because it actually creates a buffer (rather than prints it out), drops recursion for iteration and is in C instead of my previous C/Python hodgepodge.
Because it uses a static buffer, the code is not thread safe. Also note that there is no error checking that the code doesn't underflow the buffer if the number is too large. Finally, it uses a trick of building the string from the end to the front and returning a pointer to the middle of the buffer so it doesn't have to reverse the digits at the end.
您的问题可以分为两部分:
n
的表示形式,并n
符号,打印上面的表示形式。第二部分显然非常简单。如果您有给定基数中数字的表示形式,以及要在该基数中使用的符号,那么将它们打印出来只是在循环中打印内容。
为了获得给定基数中的整数表示,我们将使用一个 int 数组,其中值代表数字,索引代表位置。我们还需要存储有效位数。另外,我们假设我们只处理正数,因为这就是您在问题中所建议的。
然后,让我们编写一个函数将数字转换为其表示形式。因为返回相反的表示更容易,所以我们将返回它,然后也以相反的顺序打印:
完成此操作后,让我们编写一个函数来打印表示:
然后,我们可以编写驱动程序:
我已经编写了
Convert
和next
,以便它们彼此独立(除了我使用反向表示的明显简化之外)。这使得在其他程序中使用它们变得很容易。Your question can be split into two parts:
n
, andn
symbols, print the representation above.The second part is obviously very easy. If you have a representation of a number in a given base, and the symbols that you want to use in such a base, then printing them out is just printing things in a loop.
To get an integer's representation in a given base, we will use an array of
int
s, with the values representing the digits, and the indices representing the places. We also need to store the number of valid digits. Also, we are assuming that we're dealing with positive numbers only, since that's what you seem to suggest in your question.Then, let's write a function to convert a number to its representation. Since it's easier to return a reversed representation, we will return that, and then print in reverse order too:
Having done this, let's write a function to print the representation:
Then, we can write our driver program:
I have written
convert
andnext
above so that they're independent of each other (apart from the obvious simplification that I'm using reversed representations). This makes it easy to use them in other programs.看起来您需要重载
operator++
而不是get_next
。这就引出了下一个推论,即这个东西应该是一个单独的对象。我会将“数字”转换为十进制,然后对它们进行运算,然后将它们转换回来。
Looks like instead of
get_next
you need to overload theoperator++
. This leads to the next derivation which is that this thing should be a separate object.I would convert the "digits" into decimal, then operate on them, then convert them back.