如何在C++中使用不同进制进行计数?

6

我的15岁的弟弟开始学习编程,他写了一个很棒的小程序,可以输出所有由字母和数字组成的六位数及以下的组合。他的代码是一个六重嵌套的for循环,用于更新六级字符数组的元素。看起来很糟糕,但肯定很快!我向他展示了如何进行简单计数,并将这些数字转换为36进制。

最大的问题是,我的代码比他的慢得多,因为我在做除法。有没有一种方法可以简单地假设36进制并输出从1到36^6的计数?

理想情况下,我希望做类似于以下的事情

[base 36]
for(int i = 0; i < 1000000; i++)
   SaveForLaterFileOutput(i);

6
你把价值和表现混淆了。纯粹的计数并非可以赋予进制的概念。重构过的版本可能比你兄弟的解决方案更好! - Amardeep AC9MF
语言中没有内置的base36结构。然而,你不需要除法来做你想要的事情。 - driis
4个回答

3

试试这个:

char buffer[1024];
for(int i = 0; i < 1000000; i++)
      cout << itoa ( i, buffer, 36);

如果你没有itoa,这里是无需它的代码

cout << setbase (36);
for(int i = 0; i < 1000000; i++)
      cout << i << endl;
cout << setbase (10); // if you intend to keep using cout


2
itoa 不是标准函数,也不是所有的 C++ 库都包含它。 - Konrad Rudolph
更新后的答案没有使用itoa(感谢@Konrad Rudolph) - Lou Franco
我以为setbase()只能在8进制,10进制和16进制中使用? - Maulrus
第二个版本更为惯用,无论你是否有itoa()函数。 - rmeador

3

你的兄弟可以通过修改下面的increment函数,在不需要6个嵌套循环的情况下更新他的6元素数组。这样,你就可以在任何你选择的“基数”中进行计数:

#include <algorithm>
#include <iostream>

#define NUM_CHARS 6

// assuming ASCII
// advances through a chosen sequence 0 .. 9, a .. z
// or returns -1 on overflow
char increment(char &c) {
    if (c == 'z') return -1;
    if (c == '9') { c = 'a'; return c; }
    return ++c;
}

int main() {
    char source[NUM_CHARS+1] = {0};
    std::fill_n(&source[0], NUM_CHARS, '0');
    while (true) {
        std::cout << source << "\n";
        int idx = NUM_CHARS;
        // increment and test for overflow
        while (increment(source[--idx]) == -1) {
            // overflow occurred: carry the 1
            source[idx] = '0';
            if (idx == 0) return 0;
        }
    }
}

我并没有纠结于问题中的“或更少”部分:无论你用六个循环怎么做,这种技术都可能行得通。严格来说,这是在列举组合,这几乎但并不完全等同于计数。


1

将数字转换为36进制:创建一个累加器并从足够高的位数开始,例如36^6。如果累加器加上该数字小于您的数字,则将其添加到累加器中并重复相同位数(此计数为数字值),如果大于,则将其丢弃。重复较低位数,直到达到36^0。跟踪每个度数的计数,这就是您的36进制数字。

要以有意义的方式打印它,请执行其他操作。


1
所有计算中使用的数字都是以二进制为基础。您看到的任何其他数字都只是打印方式上的假象。因此,您的SaveForLaterOutput没有意义。
库函数itoa()(翻译为“整数到ASCII”)(现在已被安全的_itoa_s()函数所取代)允许您在准备输出时指定基数。

在二进制中并不存在“2”这个数字,因此从技术上讲,所有的计算都是基于十进制二进制进行的(不要与我们人类喜欢的数字10混淆)。 - fredoverflow
世界上只有十种人:懂二进制的和不懂的。 - James Curran
有十种人:懂三进制的,不懂的和把它误认为二进制的;) - el.pescado - нет войне
...还有那些制造陈词滥调笑话却不说明基础知识,然后神奇地期望我们知道他们在说什么的人。 - mpen
所有用于计算的数字都是“数字”。它们在操作时可能以物理形式表示的任何基础都是实现细节(而且对于现代CPU来说,int寄存器实际上并不像32个小电线那样简单,每个电线要么携带电流,要么不携带)。在内存中,它们几乎必须以接近base UCHAR_MAX+1的形式表示,而位运算符的存在意味着二进制内部表示是一种自然的想象方式。 - Steve Jessop
你的基本观点是正确的,实际上不存在“10进制数字”,只有“一个数字的10进制表示法”。 - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接