Как я могу рассчитывать в другой числовой базе в C ++? - PullRequest
5 голосов
/ 28 июля 2010

Мой 15-летний младший брат начинает программировать, и он написал маленькую аккуратную программу, которая выводит все комбинации букв и цифр, которые состоят из шести цифр или меньше. Его код представлял собой цикл for, вложенный в несколько раз, который обновлял элементы массива char с шестью уровнями. Выглядело плохо, но было, конечно, быстро! Я показал ему, как сделать простой подсчет и преобразовать эти числа в базу 36.

Самая большая проблема в том, что мой код был намного медленнее, чем его, из-за деления, которое я делал. Есть ли способ, которым я могу просто принять базу 36 и вывести счет от 1 до 36 ^ 6?

В идеале, я хочу сделать что-то вроде

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

Ответы [ 4 ]

3 голосов
/ 28 июля 2010

Попробуйте:

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

Вот это без Итоа (если у вас его нет)

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

2 голосов
/ 29 июля 2010

Ваш брат может обновить свой массив из 6 элементов, не используя 6 вложенных циклов. Изменив приведенную ниже функцию increment, вы можете рассчитывать на любую выбранную вами «базу»:

#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;
        }
    }
}

Я не беспокоился об «или меньшей» части проблемы: однако вы сделали это с 6 циклами, вероятно, будет работать и с этой техникой. Строго говоря, это перечисление комбинаций, что почти, но не совсем то же самое, что и подсчет.

1 голос
/ 28 июля 2010

Все числа, используемые в вычислениях, находятся в базе 2. Любое другое число, которое вы видите, является лишь иллюзией того, как оно напечатано.Следовательно, ваш SaveForLaterOutput не имеет смысла.

Библиотечная функция itoa() (что переводится как "целое число в ASCII") (в наши дни она была заменена безопасной функцией _itoa_s()) позволяет вам указатьбаза при подготовке к выходу.

1 голос
/ 28 июля 2010

для преобразования числа в базу 36: сделайте аккумулятор и начните с достаточно высокой степени, например 36 ^ 6.Если аккумулятор плюс это число меньше вашего числа, добавьте его к аккумулятору и повторите для той же степени (счетчик это значение цифры), если он больше, выбросьте его.Повторите для более низких степеней, пока не получите 36 ^ 0.Следите за количеством для каждого градуса, и это ваш номер в базе 36.

, чтобы распечатать его осмысленно, сделайте что-нибудь еще.

...