Перестановка цифр числа - PullRequest
       1

Перестановка цифр числа

2 голосов
/ 29 января 2012

Рассмотрим число 194, объявленное как тип int Можно ли эффективно получить его перестановки цифр, как и другие целые числа?Номер: 194419 int 491 int 914 int 941 int

Я использую next_permutation, однако он работает только с массивами.Поэтому я подумал, что было бы неразумно преобразовывать int в массив int (?!), А затем получать перестановку в виде массива и преобразовывать ее в него.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 29 января 2012

Перестановка цифр в основном является строковой операцией, а не (простой) математической операцией. Преобразование в массив (строку) с последующим использованием next_permutation() звучит более разумно, чем пытаться сделать это математически.

Вот математическая версия - без сохраненных промежуточных значений:

int a = 194;
int b = (a / 100)       * 100 + (a % 10)        * 10 + ((a / 10) % 10) * 1; // 149
int c = (a % 10)        * 100 + ((a / 10) % 10) * 10 + (a / 100)       * 1; // 491
int d = (a % 10)        * 100 + (a / 100)       * 10 + ((a / 10) % 10) * 1; // 419
int e = ((a / 10) % 10) * 100 + (a / 100)       * 10 + (a % 10)        * 1; // 914
int f = ((a / 10) % 10) * 100 + (a % 10)        * 10 + (a / 100)       * 1; // 941

С промежуточными значениями немного легче увидеть, что происходит (за исключением того, что на этот раз я сгенерировал разные назначения для b - f).

int a = 194;
int d1 = a / 100;
int d2 = (a / 10) % 10;
int d3 = a % 10;

int a = d1 * 100 + d2 * 10 + d3 * 1; // 194
int b = d1 * 100 + d3 * 10 + d2 * 1; // 149
int c = d2 * 100 + d1 * 10 + d3 * 1; // 914
int d = d2 * 100 + d3 * 10 + d1 * 1; // 941
int e = d3 * 100 + d1 * 10 + d2 * 1; // 419
int f = d3 * 100 + d2 * 10 + d1 * 1; // 491

Использовать механизм next_permutation(); он будет обобщать до 4-значных и 5-значных и N-значных чисел, если это не так.

0 голосов
/ 29 января 2012

Сначала вам нужно сначала извлечь значение каждого десятичного разряда: либо преобразовав его в массив символов (itoa()), либо написав небольшой цикл for, который делит число на степени 10. Как только вы получите цифры разделенные, вы можете написать цикл для генерации перестановок.

0 голосов
/ 29 января 2012

Получение перестановок десятичных цифр потребует от вас взаимодействия с числом в виде десятичного числа, поэтому манипуляции с степенью 2, вероятно, здесь не сильно помогут.

Я бы посоветовал:

1. Convert number to string
2. Set up the string as a circular buffer
3. Step through the buffer progressively (each increment of the index into the circular buffer will give you one permutation)
4. Reconstruct the number from the "new" arrangement of the characters representing the digits
5. Repeat for the length of the string.

Если вы не работаете в медленной среде с ограниченными ресурсами, я бы не стал задумываться над этой проблемой.

Редактировать:

Как указано в комментариях, это не генерирует все перестановки, для этого потребуется добавить еще один шаг в конце, где процесс повторяется, но с постепенно увеличивающимися приращениями к индексной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...