Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032

Размещение с повторениями

04.02.2023, 21:46. Показов 774. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Задан массив как последовательность от 0 до (n-1).
Задано количество набора k;

Например, заданы n = 3 и k = 2. Получается массив {0,1,2}.

Нужно получить список размещений с повторениями. То есть получить такой результат:
{0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {1,2}, {2,0}, {2,1}, {2,2}.

Написал такой код:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
 
namespace test
{
    class Program
    {               
        static void Main(string[] args)
        {         
            int n = 3;
            int k = 2;
 
            Class1 class1 = new Class1();
            class1.GetCombinations(new int[k], 0, 0, n-1);
            var result = class1.result;
            Console.ReadKey();
        }        
    }
 
    class Class1
    {
        public List<int[]> result = new List<int[]>();
 
        public void GetCombinations(int[] arr, int index, int start, int end)
        {
            if (index >= arr.Length)
            {
                result.Add((int[])arr.Clone());
            }
            else
                for (int i = start; i <= end; i++)
                {
                    arr[index] = i;
                    GetCombinations(arr, index + 1, i, end);
                }            
        }
    }
}

Но работает неправильно. Выдает такой результат:
{0,0}, {0,1}, {0,2}, {1,1}, {1,2}, {2,2}.

Как правильно надо написать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.02.2023, 21:46
Ответы с готовыми решениями:

Размещение с повторениями
Помогите пожалуйста с заданием Написать программу реализующую размещение с повторениями: {\bar{A_{n}^{k}} Реализовать: 1) ввод с...

Размещение с повторениями
Даны n чисел,n&lt;=10 между ними поставить знаки &quot;+&quot; или &quot;-&quot;,чтобы получилась сумма равная S. Например, даны числа 1 2 5 7 надо поставить...

Размещение с повторениями
Помогите, пожалуйста. Буду очень благодарна. Задано натуральные числа n и k. Навести в лексикографическом порядке все размещения с...

9
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
04.02.2023, 23:30
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   static void Main(string[] args)
        {
 
            var n = 5;
 
            for (int i = 0; i <= n; i++)
            {
                for (int j = 0; j <= n; j++)
                {
                    Console.Write($$"""{{{i}},{{j}}} """);
                }
                Console.WriteLine();
            }
 
            Console.ReadKey();
        }
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
04.02.2023, 23:42  [ТС]
Получается это для при k=2. Но k динамичен.
0
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
05.02.2023, 00:08
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 static void Main(string[] args)
        {
            var n = 3;
            var k = 2;
 
 
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j <= k; j++)
                {
                    Console.Write($$"""{{{i}},{{j}}} """);
                }
                Console.WriteLine();
            }
 
            Console.ReadKey();
        }
Добавлено через 12 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    class Program
    {
        static void Main(string[] args)
        {
            int n = 3;
            int k = 2;
 
            Class1 class1 = new Class1(n, k);
 
            var result = class1.Combinations;
            Console.ReadKey();
        }
    }
    public class Class1
    {
        private readonly int _n;
        private readonly int _k;
 
        public Class1(int n, int k)
        {
            if (n <= 0) { throw new ArgumentException($"Значение переменной {nameof(n)} должно быть больше нуля!"); }
            if (k <= 0) { throw new ArgumentException($"Значение переменной {nameof(k)} должно быть больше нуля!"); }
 
            _n = n;
            _k = k;
        }
 
        public string Combinations
        {
            get
            {
                var sb = new StringBuilder();
                for (int i = 0; i < _n; i++)
                {
                    for (int j = 0; j <= _k; j++)
                    {
                        sb.Append($$"""{{{i}},{{j}}} """);
                    }
                    sb.AppendLine();
                }
 
                return sb.ToString();
            }
        }
    }
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
05.02.2023, 01:18
Цитата Сообщение от MConst Посмотреть сообщение
Получается это для при k=2. Но k динамичен.
Методы расширения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
namespace CommonCore
{
    public static partial class CombinatoricsHelper
    {
        /// <summary>Получение размещений с повторением длиной <paramref name="k"/> из <paramref name="n"/> чисел.</summary>
        /// <param name="n">Общее количество чисел.</param>
        /// <param name="k">Количество чисел в размещении.</param>
        /// <returns>Последовательность, содержащую все размещения из <paramref name="n"/> по <paramref name="k"/>.</returns>
        /// <remarks>См. <see href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5">Размещение | ВикипедиЯ</see>.<br/>
        /// Обратить внимание! Всегда возвращается один и тот же массив, но в каждой итерации в нём изменяются элементы.
        /// Поэтому для запоминая размещения нужно сделать копию состояния массива в итерации.</remarks>
        /// <exception cref="ArgumentOutOfRangeException">Если <paramref name="n"/> или <paramref name="k"/> не положительное число.</exception>
        public static IEnumerable<int[]> GetArrangementsWithRepetitions(this int n, int k)
        {
            if (n < 1) throw new ArgumentOutOfRangeException(nameof(n), "Должно быть положительное число.");
            if (k < 1) throw new ArgumentOutOfRangeException(nameof(k), "Должно быть положительное число.");
 
            // Младшее размещение.
            int[] arrangement = new int[k];
            int level; // Мутировавший уровень.
            int max = n -1; // Максимальное число для позиции.
            int maxK = k - 2; // Предмаксимальный уровень.
 
            do
            {
                // Быстрый перебор последнего уровня.
                for (; arrangement[^1] < n; arrangement[^1]++)
                {
                    // Возврат текущего размещения.
                    yield return arrangement;
                }
 
                // Поиск уровня мутации.
                // Перебор размещения с конца на поиск первого меньшего максимально допустимого.
                for (level = maxK; level >= 0; level--)
                {
                    // Если есть уровень мутации,
                    // то его приращение на единицу и сброс следующих уровней.
                    if (arrangement[level] < max)
                    {
                        arrangement[level]++;
                        for (level++; level < arrangement.Length; level++)
                        {
                            arrangement[level] = 0;
                        }
                        break;
                    }
                }
            } while (level >= 0);
        }
 
        /// <summary>Возвращает последовательность размещений с повторением заданного множества.</summary>
        /// <typeparam name="T">Тип элементов множества.</typeparam>
        /// <param name="set">Исходное множество.</param>
        /// <param name="k">Длина размещения.</param>
        /// <returns>Последовательность, содержащую все размещения с повторением из <paramref name="set"/> по <paramref name="k"/>.</returns>
        /// <remarks>См. <see href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5">Размещение | ВикипедиЯ</see>.<br/>
        /// Обратить внимание! Всегда возвращается один и тот же массив, но в каждой итерации в нём изменяются элементы.
        /// Поэтому для запоминая размещения нужно сделать копию состояния массива в итерации.</remarks>
        /// <exception cref="ArgumentOutOfRangeException">Если <paramref name="k"/> не положительное число.</exception>
        public static IEnumerable<T[]> GetArrangementsWithRepetitions<T>(this IEnumerable<T> set, int k)
        {
            if (k < 1) throw new ArgumentOutOfRangeException(nameof(k), "Должно быть положительное число.");
 
            T[] array = set.ToArray();
 
 
            T[] arrangement = new T[k];
 
            foreach (var item in array.Length.GetArrangementsWithRepetitions(k))
            {
                for (int i = 0; i < arrangement.Length; i++)
                {
                    arrangement[i] = array[item[i]];
                }
                yield return arrangement;
            }
        }
    }
}
Использование:
C#
1
2
3
    var arrangements = 3.GetArrangementsWithRepetitions(2)
                        .Select(arr => (arr[0], arr[1]));
    WriteLine(string.Join(",", arrangements));
C#
1
2
3
4
    var arrangements = new string[] {"Первый", "Второй", "Третий" }
                        .GetArrangementsWithRepetitions(2)
                        .Select(arr => (arr[0], arr[1]));
    WriteLine(string.Join(",", arrangements));
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
05.02.2023, 10:15  [ТС]
Цитата Сообщение от 116rus Посмотреть сообщение
C#
1
Console.Write($$"""{{{i}},{{j}}} """);
Ошибка "Недопустимый символ "$""

Добавлено через 4 минуты
У меня C# 7.3.

Добавлено через 1 час 24 минуты
Так заработало

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Collections.Generic;
 
namespace test
{
    class Program
    {               
        static void Main(string[] args)
        {         
            int n = 3;
            int k = 2;
 
            Class1 class1 = new Class1();
            class1.GetCombinations(new int[k], 0, 0, n-1);
            var result = class1.result;
 
            foreach (int[] temp in result)
            {
                for (int i = 0; i < temp.Length; i++)
                {
                    Console.Write($"{temp[i]} ");
                }
                Console.WriteLine();
            }
 
            Console.ReadKey();
        }        
    }
 
    public class Class1
    {
        public List<int[]> result = new List<int[]>();
 
        public void GetCombinations(int[] arr, int index, int start, int end)
        {
            if (index >= arr.Length)
            {
                result.Add((int[])arr.Clone());
            }
            else
                for (int i = 0; i <= end; i++)
                {
                    arr[index] = i;
                    GetCombinations(arr, index + 1, i, end);
                }            
        }
    }
}

Тут есть что не учитывается (кроме проверки на входе k и n, чтобы были положительными)? Важно получить массив, а не выводить в консоль.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
05.02.2023, 11:56
Цитата Сообщение от MConst Посмотреть сообщение
Ошибка "Недопустимый символ "$""
Дублирование $. Этот знак - оператор интерпретации строки. И ставится перед строкой только один раз.

Добавлено через 6 минут
Цитата Сообщение от MConst Посмотреть сообщение
У меня C# 7.3.
Советую переходить на .Net.
Развитие Framework официально остановлено на версии 4.8. Дальше он развиваться не будет.

Сейчас используется уже одиннадцатая версия Шарпа, а вы до сих пор сидите на седьмой.
В этом не ничего страшного, если вы знаете все версии и для вас не представляет трудности портировать код из одной в другую.
Но раз вы это указали, то похоже для вас это трудно. Поэтому обязательно работайте на .Net так как в дальнейшем вам это пригодиться в реальной работе после учёбы.

Добавлено через 14 минут
Цитата Сообщение от MConst Посмотреть сообщение
Важно получить массив, а не выводить в консоль.
Достаточно задать преобразование в массив:
C#
1
2
3
4
    var arrangements = new string[] {"Первый", "Второй", "Третий" }
                        .GetArrangementsWithRepetitions(2)
                        .Select(arr => (arr[0], arr[1]))
                        .ToArray();
Цитата Сообщение от MConst Посмотреть сообщение
Тут есть что не учитывается (кроме проверки на входе k и n, чтобы были положительными)?
1) Рекурсия может создать проблемы особенно при больших значениях n и к;

2) Создавать экземпляр класса Class1 совершенная бессмыслица. Даже не бессмыслица, а ошибка. Вызовите метод GetCombinations несколько раз для одного экземпляра и посмотрите какой будет результат;

3) По своему функционалу метод GetCombinations зависит только от своих параметров, поэтому нужно сделать его статическим, и чтобы он возвращал полученный результат.

4) В метод передаётся куча не нужных параметров, когда должны передаваться только k и n;

5) Результат возвращается только весь сразу. Обработка размещений по мере их получения невозможна, что значительно ухудшает возможности для распараллеливания выполнения.
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
05.02.2023, 12:14  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Советую переходить на .Net.
Развитие Framework официально остановлено на версии 4.8. Дальше он развиваться не будет.

Сейчас используется уже одиннадцатая версия Шарпа, а вы до сих пор сидите на седьмой.
В этом не ничего страшного, если вы знаете все версии и для вас не представляет трудности портировать код из одной в другую.
Но раз вы это указали, то похоже для вас это трудно. Поэтому обязательно работайте на .Net так как в дальнейшем вам это пригодиться в реальной работе после учёбы.
Скажите, если перейду на новую версию си шарп, то в новой версии полностью откроются ранее сохраненные проекты? Надо будет что-то дополнительно настраивать и/или подключать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
05.02.2023, 13:23
Цитата Сообщение от MConst Посмотреть сообщение
сли перейду на новую версию си шарп, то в новой версии полностью откроются ранее сохраненные проекты?
Тип проекта устанавливается в его свойствах и изменить Framework на Core (.Net) не получится.
Но все исходники Шарпа со 100% гарантией будут запускаться на более больших версиях.
Наоборот - не всегда.
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
05.02.2023, 14:54  [ТС]
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2023, 14:54
Помогаю со студенческими работами здесь

Размещение с повторениями
Из урны, в которой находятся 3 красных шара, 3 синих и 2 зеленых, вынимают шар, отмечают его цвет и возвращают в урну. Всего эта операция...

Размещение с повторениями
Помогите, пожалуйста. Буду очень благодарна. Задано натуральные числа n и k. Навести в лексикографическом порядке все размещения с...

Размещение с повторениями
Пароль (тема: размещение с повторениями). Сколько можно составить паролей с длиной N символов из заданного набора символов латинского ...

Написать программу реализующую размещение с повторениями
Помогите пожалуйста. Написать программу реализующую размещение с повторениями: {\bar{A_{n}^{k}} Реализовать: 1) ввод с клавиатуры...

Перестановка с повторениями
Доброго времени суток! Помогите, пожалуйста, найти ошибку в коде. Условие: На день рождения Пете подарили набор карточек с буквами....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru