Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

как можно реализовать такую идею, но для N любого?

#c_sharp #массивы


int N = 3;
string s = ""; 
int[] arrayN = new int[] { 1, 2, 3 };
for (int i = 0; i < N; i++)
{
    s = s + arrayN[i];
    for (int j = 0; j < N; j++)
    {
        s = s + arrayN[j];
        for (int k = 0; k < N; k++)
        {
            Console.Write(s + arrayN[k] + "\n");
        }
        s = "";
        s = s + arrayN[i];
    }
    s = "";
}




Output:

111
112
113
121
122
123
131
132
133
211
212
213
221
222
223
231
232
233
311
312
313
321
322
323
331
332
333

    


Ответы

Ответ 1



using System.Linq; int N = 3; //NB! не пытайтесь использовать большие N int[] arrayN = Enumerable.Range(1, N).ToArray(); //если у нас ограниченый алфавит, то используем new int[]{1,2,3} string[] result = arrayN.Select(n => $"{n}").ToArray(); for (int i = 1; i < N; i++) { result = (from a in arrayN from b in result select $"{a}{b}").ToArray(); } P.S. for @Андрей для получения числовых результатов надо всего лишь поменять две строки int[] result = arrayN; ... select b*10 + a).ToArray();

Ответ 2



function combinations(arr, level, text) { for (var i = 0; i < arr.length; i++) { var out = text + "" + arr[i]; if (level < arr.length - 1) combinations(arr, level + 1, out); else document.write(out + "
"); } } combinations([1, 2, 3, 4, 5], 0, "");

Ответ 3



Вариант без рекурсии (и на шарпе :) ): int N = 5; int[] arr = { 1, 2, 3, 4, 5 }; int C = 1; for (int i = 0; i < N; ++i) C *= arr.Length; for (int i = 0; i < C; ++i) { int d = i; string s = ""; for (int j = 0; j < N; ++j) { s = arr[d % arr.Length] + s; d /= arr.Length; } Console.WriteLine(s); } N - число разрядов на выходе, arr - массив возможных значений для разрядов Тоже самое, но в виде генератора + на выходе числа, а не строки: static IEnumerable GetCombinations(int n, int[] arr) { if (n < 1) yield break; int count = arr.Length; int[] exp = new int[n]; exp[0] = 1; for (int j = 1; j < n; ++j) { exp[j] = 10 * exp[j - 1]; count *= arr.Length; } for (int i = 0; i < count; ++i) { int d = i; int k = 0; for (int j = 0; j < n; ++j) { k += arr[d % arr.Length] * exp[j]; d /= arr.Length; } yield return k; } } Использовать можно так: foreach (var k in GetCombinations(5, new[] { 1, 2, 3, 4 })) Console.WriteLine(k);

Ответ 4



А вот чисто математическое решение: var N = 3; var mask = Enumerable.Range(0, N).Select(x => (int)Math.Pow(N, x)).Reverse().ToArray(); for (var i = 0; i < Math.Pow(N, N); i++) { var number = string.Join("", mask.Select(x => (i / x % N + 1).ToString())) Console.WriteLine(number); } Вариант со словарем: var N = 3; var dictionary = new [] {"A", "B", "C"}; if (dictionary.Length < N) throw new InvalidOperationException("dictionary is not enough"); var mask = Enumerable.Range(0, N).Select(x => (int)Math.Pow(N, x)).Reverse().ToArray(); for (var i = 0; i < Math.Pow(N, N); i++) { Console.WriteLine(string.Join("", mask.Select(x => dictionary[i / x % N]))); }

Комментариев нет:

Отправить комментарий