Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для ArtSmm
32 / 32 / 2
Регистрация: 07.01.2016
Сообщений: 488

BigInteger не совсем понимаю как быть с в этом случае

10.12.2022, 15:12. Показов 1400. Ответов 26

Студворк — интернет-сервис помощи студентам
Всем привет
Столкнулся с вопросом в задаче:
Пробую делать так:
C#
1
2
BigInteger nFac = Enumerable.Range(1, N).Aggregate(1, (p, item) => p * item);
BigInteger nkFac = Enumerable.Range(1, N - K).Aggregate(1, (p, item) => p * item);
Задача: есть 300 слов и 8 ячеек для них, нужно посчитать количество уникальных размещений.
Почему думаю, что неверно сделал:
Если делать прямым перебором, то получается так:
14 слов - 12 ячеек если подставить, то 43589145600 - должно быть. У меня получается: 639472640
С BigInt работаю первый раз. Можете подсказать как этот код под данный класс переписать? Потому что считаю, вроде верно, формулу брал отсюда: https://ru.wikipedia.org/wiki/... 0%B8%D0%B5
Общее количество размещений, я понимаю, это N в степени K, то так:
C#
1
BigInteger total = BigInteger.Pow(N, K);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2022, 15:12
Ответы с готовыми решениями:

Хочу собрать игровой пк, но совсем в этом не понимаю, кинули две сборки, какая лучше?
Здравствуйте, хочу купить игровой пк, сама в этой не сильно разбираюсь, но хочется чтобы рдр 2, Ведьмак и т.д. на максималках были. это...

Совсем не понимаю как делать
Функция принимает строку и определяет является ли он числом(если можно весь код), я поступал на биологию, а не на программирование

Совсем не понимаю как делать задание
Не понимаю ничего на столько, что даже интерфейс приложения не получается сделать(

26
 Аватар для ArtSmm
32 / 32 / 2
Регистрация: 07.01.2016
Сообщений: 488
16.12.2022, 23:57  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
индекс в общем массиве
хм.. по сути, да, индекс получается.
Те сначала строим массив? Потом ищем индексы нужных цветов? Верно понял?
Осталось понять как из всего этого массив построить))
Цитата Сообщение от Элд Хасп Посмотреть сообщение
количеством размещений всего
я подразумеваю то что и говорил - сколько всего комбинацией может быть: уникальных и неуникальных. N в степени K те
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
17.12.2022, 00:06
Цитата Сообщение от ArtSmm Посмотреть сообщение
я подразумеваю то что и говорил - сколько всего комбинацией может быть: уникальных и неуникальных. N в степени K те
Может сколько может быть размещений и сочетаний?
Их количество отличается в n! раз, где n длина подмножества.

Добавлено через 1 минуту
Цитата Сообщение от ArtSmm Посмотреть сообщение
Осталось понять как из всего этого массив построить))
Где-то на форуме я делал метод для получения всех сочетаний или комбинаций.
Надо поискать.

Добавлено через 3 минуты
ArtSmm, посмотрите здесь, может подойдёт: Сочетания элементов
0
 Аватар для ArtSmm
32 / 32 / 2
Регистрация: 07.01.2016
Сообщений: 488
17.12.2022, 00:11  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
сколько может быть размещений и сочетаний
может быть... не шарю в математике. Постарался объяснить как понимаю
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
17.12.2022, 19:09
Цитата Сообщение от ArtSmm Посмотреть сообщение
не шарю в математике.
Вот методы расширения для получения всех сочетаний по последовательному множеству чисел:
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
using System.Collections.ObjectModel;
 
namespace Core2022
{
    public static 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%A1%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D0%B5">Сочетание | ВикипедиЯ</see>.<br/>
        /// Обратить внимание! Всегда возвращается один и тот же массив, но в каждой итерации в нём изменяются элементы.
        /// Поэтому для запоминая комбинации нужно сделать копию состояния массива в итерации.</remarks>
        public static IEnumerable<int[]> GetCombinations(this int n, int k)
        {
            if (n < 1) throw new ArgumentOutOfRangeException(nameof(n), "Должно быть положительное число.");
            if (k < 1) throw new ArgumentOutOfRangeException(nameof(k), "Должно быть положительное число.");
            if (k > n) throw new ArgumentOutOfRangeException(nameof(k), $"Длина сочетания не может превышать длину множества {n}.");
 
            // Младшее сочетание.
            int[] combination = Enumerable.Range(0, k).ToArray();
            int range; // Мутировавший уровень.
            int max; // Максимальное число для уровня.
            int maxN = n - 1; // Максимальное число.
            int maxK = k - 1; // Максимальный уровень.
 
            do
            {
                // Возврат текущего сочетания.
                yield return combination;
 
                // Поиск уровня мутации.
                // Перебор сочетания с конца на поиск первого меньшего максимально допустимого.
                for (range = maxK, max = maxN; range >= 0; range--, max--)
                {
                    if (combination[range] < max)
                        break;
                }
 
                // Если есть уровень мутации,
                // то его приращение на единицу и сброс следующих уровней.
                if (range >= 0)
                {
                    combination[range]++;
                    max = combination[range];
                    for (range++; range < combination.Length; range++)
                    {
                        max++;
                        combination[range] = max;
                    }
                }
            } while (range >= 0) ;
        }
 
        /// <summary>Возвращает последовательность иммутабельных копий коллекций.</summary>
        /// <typeparam name="T">Тип элемента коллекции.</typeparam>
        /// <param name="collections">Последовательность коллекций.</param>
        /// <returns>Последовательность созданная копированием каждого элемента
        /// <paramref name="collections"/> в массив и передачей его
        /// в метод <see cref="Array.AsReadOnly{T}(T[])"/>. </returns>
        public static IEnumerable<ReadOnlyCollection<T>> CopyCollections<T>(this IEnumerable<IEnumerable<T>> collections)
        {
            foreach (var collection in collections)
            {
                yield return Array.AsReadOnly(collection.ToArray());
            }
        }
    }
}
Пример использования:
C#
1
2
3
4
    foreach (var item in 5.GetCombinations(3))
    {
        WriteLine(string.Join(", ", item));
    }
Консоль0, 1, 2
0, 1, 3
0, 1, 4
0, 2, 3
0, 2, 4
0, 3, 4
1, 2, 3
1, 2, 4
1, 3, 4
2, 3, 4


В вашей задаче метод GetCombinations возвращает индексы элементов множества.
0
 Аватар для ArtSmm
32 / 32 / 2
Регистрация: 07.01.2016
Сообщений: 488
17.12.2022, 19:13  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
методы расширения для получения всех
Спасибо огромное) очень помогли
Цитата Сообщение от Элд Хасп Посмотреть сообщение
элементов множества
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
17.12.2022, 20:56
ArtSmm, вот ещё один метод расширения дополняющий два предыдущих:
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
    public static partial class CombinatoricsHelper
    {
        /// <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%A1%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D0%B5">Сочетание | ВикипедиЯ</see>.<br/>
        /// Обратить внимание! Всегда возвращается один и тот же массив, но в каждой итерации в нём изменяются элементы.
        /// Поэтому для запоминая комбинации нужно сделать копию состояния массива в итерации.</remarks>
        /// <exception cref="ArgumentOutOfRangeException">Если <paramref name="k"/> не положительное число
        /// или если больше количества элементов в <paramref name="set"/>.</exception>
        public static IEnumerable<T[]> GetCombinations<T>(this IEnumerable<T> set, int k)
        {
            if (k < 1) throw new ArgumentOutOfRangeException(nameof(k), "Должно быть положительное число.");
 
            T[] array = set.ToArray();
 
            if (k > array.Length) throw new ArgumentOutOfRangeException(nameof(k), $"Длина сочетания не может превышать длину множества set.");
 
            T[] combination = new T[k];
 
            foreach (var item in array.Length.GetCombinations(k))
            {
                for (int i = 0; i < combination.Length; i++)
                {
                    combination[i] = array[item[i]];
                }
                yield return combination;
            }
        }
    }
Добавлено через 8 минут
И чуть улучшенный GetCombinations - убран лишний if и ускорил перебор последнего уровня:
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
    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%A1%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D0%B5">Сочетание | ВикипедиЯ</see>.<br/>
        /// Обратить внимание! Всегда возвращается один и тот же массив, но в каждой итерации в нём изменяются элементы.
        /// Поэтому для запоминая комбинации нужно сделать копию состояния массива в итерации.</remarks>
        /// <exception cref="ArgumentOutOfRangeException">Если <paramref name="n"/> не положительное число.
        /// Или если <paramref name="k"/> не положительное число или если больше <paramref name="n"/>.</exception>
        public static IEnumerable<int[]> GetCombinations(this int n, int k)
        {
            if (n < 1) throw new ArgumentOutOfRangeException(nameof(n), "Должно быть положительное число.");
            if (k < 1) throw new ArgumentOutOfRangeException(nameof(k), "Должно быть положительное число.");
            if (k > n) throw new ArgumentOutOfRangeException(nameof(k), $"Длина сочетания не может превышать длину множества {n}.");
 
            // Младшее сочетание.
            int[] combination = Enumerable.Range(0, k).ToArray();
            int level; // Мутировавший уровень.
            int max; // Максимальное число для уровня.
            int maxN = n - 1; // Максимальное число.
            int maxK = k - 2; // Предмаксимальный уровень.
 
            do
            {
                // Быстрый перебор последнего уровня.
                for (; combination[^1] < n; combination[^1]++)
                {
                    // Возврат текущего сочетания.
                    yield return combination;
                }
 
                // Поиск уровня мутации.
                // Перебор сочетания с конца на поиск первого меньшего максимально допустимого.
                for (level = maxK, max = maxN; level >= 0; level--, max--)
                {
                    // Если есть уровень мутации,
                    // то его приращение на единицу и сброс следующих уровней.
                    if (combination[level] < max)
                    {
                        combination[level]++;
                        max = combination[level];
                        for (level++; level < combination.Length; level++)
                        {
                            max++;
                            combination[level] = max;
                        }
                        break;
                    }
                }
            } while (level >= 0);
        }
 
        /// <summary>Возвращает последовательность иммутабельных копий коллекций.</summary>
        /// <typeparam name="T">Тип элемента коллекции.</typeparam>
        /// <param name="collections">Последовательность коллекций.</param>
        /// <returns>Последовательность созданная копированием каждого элемента
        /// <paramref name="collections"/> в массив и передачей его
        /// в метод <see cref="Array.AsReadOnly{T}(T[])"/>. </returns>
        public static IEnumerable<ReadOnlyCollection<T>> CopyCollections<T>(this IEnumerable<IEnumerable<T>> collections)
        {
            foreach (var collection in collections)
            {
                yield return Array.AsReadOnly(collection.ToArray());
            }
        }
    }
0
 Аватар для ArtSmm
32 / 32 / 2
Регистрация: 07.01.2016
Сообщений: 488
18.12.2022, 00:57  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вот ещё один метод
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.12.2022, 00:57

Не совсем понимаю, как работает Thread
Есть программа, на винформе, которая при нажатии кнопки а делает большой объем работы, из-за которого форма зависает. Чтобы такого не было,...

Не совсем понимаю как решать СНУ
Мне нужно решить СНУ lsolve-ом, зейделем, якоби и прочими. Я могу решить этими методами обычные СЛАУ, но честно говоря не понимаю как в...

Не совсем понимаю как работает список в функции
Всем привет, по ходу работы со списками и функциями заметил одну особенность: def fun1(a): a = return a def fun2(a):...

Не совсем понимаю, как работает данный код
Разбираю код калькулятора со скобками и не очень понимаю, как он работает. Может кто объяснить? Header: #pragma once #include...

Я не совсем понимаю как создать родительскую форму
У меня есть 2 формы, Form1 (меню) и Form2 (таблицы), необходимо создать функцию &quot;при нажатий кнопки из Form (меню) закрывалась форма Form2...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru