#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 IEnumerableGetCombinations(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]))); }
Комментариев нет:
Отправить комментарий