Получить числа не прибегая к размножению строк

Рейтинг: 0Ответов: 1Опубликовано: 25.03.2023

Есть огромный кусок кода подсчёта различных комбинаций 4-значного числа,рабочий фрагмент.

        myArr[0] = a * 1000 + b * 100 + c * 10 + d;
        myArr[1] = a * 1000 + b * 100 + d * 10 + c;
        myArr[2] = a * 1000 + c * 100 + b * 10 + d;
        myArr[3] = a * 1000 + c * 100 + d * 10 + b;
        myArr[4] = a * 1000 + d * 100 + b * 10 + c;
        myArr[5] = a * 1000 + d * 100 + c * 10 + b;

        myArr[6] = b * 1000 + a * 100 + c * 10 + d;
        myArr[7] = b * 1000 + a * 100 + d * 10 + c;
        myArr[8] = b * 1000 + c * 100 + a * 10 + d;
        myArr[9] = b * 1000 + c * 100 + d * 10 + a;
        myArr[10] = b * 1000 + d * 100 + a * 10 + c;
        myArr[11] = b * 1000 + d * 100 + c * 10 + a;

        myArr[12] = c * 1000 + a * 100 + b * 10 + d;
        myArr[13] = c * 1000 + a * 100 + d * 10 + b;
        myArr[14] = c * 1000 + b * 100 + a * 10 + d;
        myArr[15] = c * 1000 + b * 100 + d * 10 + a;
        myArr[16] = c * 1000 + d * 100 + b * 10 + a;
        myArr[17] = c * 1000 + d * 100 + a * 10 + b;

        myArr[18] = d * 1000 + a * 100 + c * 10 + b;
        myArr[19] = d * 1000 + a * 100 + b * 10 + c;
        myArr[20] = d * 1000 + b * 100 + c * 10 + a;
        myArr[21] = d * 1000 + b * 100 + a * 10 + c;
        myArr[22] = d * 1000 + c * 100 + b * 10 + a;
        myArr[23] = d * 1000 + c * 100 + a * 10 + b;

А можно ли это как-то в цикле обработать под вспомогательным массивом? Например

int[] myArr1 = new int[24]; //Массив куда записываются комбинации 4-значного числа
int[] myArrInt = new int[4]; //Массив,где хранятся полученные,в результате разбиения исходного 4-значного числа отдельные числа

 myArrInt[0] = geta(a);
 myArrInt[1] = getb(b);
 myArrInt[2] = getc(c);
 myArrInt[3] = getd(d);
for (int i = 1; i <myArr1.Length; i++) //Основной цикл для записи в массив комбинаций 4-значного числа
             {
               for (int j = 1; j < myArrInt.Length; j++)
              {
                 myArr1[i] = myArrInt[0]*1000 + myArrInt[1]*100 + myArrInt[2]*10 + myArrInt[3]; //Во 2-ом цикле хочу сдвигать элементы массива и поочерёдно их складывать
                }
            }

То есть как можно вместо нескольких строк всё вместить в один цикл по массиву?Как-то j+1 или на каждый подсчёт делать цикл. Код прошу не писать,просто подсказать алгоритм или объяснить можно или нельзя..

Ответы

▲ 4Принят

Как пример, можно заюзать очередь.

То есть алгоритм

  1. Вынимаем из очереди число
  2. Добавляем его в нужный разряд к результату
  3. Если очередь не пустая, рекурсивно повторяем
  4. Вернем число в очередь и другое число вынем

Код выглядит как то так

void AllPlacements(Queue<int> q, int current, int multiplier, List<int> ret)
{   
    if (q.Count == 0) ret.Add(current);
    for(int i=0; i<q.Count; i++)
    {
        var v = q.Dequeue();
        var nextCurrent = current + v * multiplier;
        AllPlacements(q, nextCurrent, multiplier*10, ret);      
        q.Enqueue(v);
    }   
}

Проверка

var ret = new List<int>();
var q = new Queue<int>();
q.Enqueue(1);
q.Enqueue(2);
q.Enqueue(3);
q.Enqueue(4);   
AllPlacements(q, 0, 1, ret);    
ret.ForEach(Console.WriteLine);

Вывод

4321
3421
2431
4231
3241
2341
1432
4132
3142
1342
4312
3412
2143
1243
4213
2413
1423
4123
3214
2314
1324
3124
2134
1234