работа с очень большими целыми числами в c#

StackOverflow https://stackoverflow.com/questions/930611

  •  06-09-2019
  •  | 
  •  

Вопрос

Кто-нибудь знает способ, которым я могу вычислить очень большие целые числа на c#

Я пытаюсь вычислить факториал чисел, например

5! = 5*4*3*2*1 = 120

при небольших числах это не проблема, но попытка вычислить факториал самого большого значения unsigned int, которое равно 4,294,967,295, кажется невозможной.

Я заглянул в класс BigInteger, но, похоже, он не делает того, что мне нужно

мы были бы очень признательны за любую помощь

Это было полезно?

Решение

4294967295!= 10^(10^10.597) ~ 10^(40000000000) Для хранения этого значения требуется около 40 Гб оперативной памяти, даже если вы найдете какую-либо реализацию BigInteger для C #!

P.S.Что ж, при оптимизированном хранении, скажем, 9 цифр в 4 байтах, потребуется ~ 18 Гб оперативной памяти.

Другие советы

Чтобы вычислить факториал uint.MaxValue вам понадобится лот из хранилища.

Например, в Статья в Википедии как 8.2639316883...× 10^5,565,708.Ты будешь собирать информацию как сумасшедший.

Я сильно подозреваю, что вы не найдете никакого способа вычислить это на нормальном компьютере за нормальное количество времени.Зачем вам нужно это значение?Будет ли приближение Стирлинга достаточно близким?

Во-первых, стоит отметить, что факториал uint.MaxValue является астрономически Большой.Я не могу найти хорошую оценку порядка величины его факториала, но его битовое представление, вероятно, будет занимать высокий процент стандартной оперативной памяти, если не намного превышать его.

A BigInteger класс, похоже, это то, что вам нужно, при условии, что вы хотите увеличить его примерно до 1 000 000 или около того (очень грубо).После этого время и память становятся очень ограниченными.В текущих (стабильных) версиях .NET, вплоть до 3.5, вы должны использовать пользовательскую реализацию. Этот что касается CodeProject, то он, похоже, получил высокую оценку.Если вам посчастливилось разрабатывать для .NET 4.0, команда Microsoft наконец-то удосужилась включить BigInteger класс в System.Numerics пространство имен BCL.В отличие от некоторых реализаций BigInteger, существующая в .NET 4.0, не имеет встроенного метода factorial (я не уверен насчет метода CodeProject), но реализовать его должно быть тривиально - хорошим способом был бы метод расширения.

Поскольку вы, похоже, думаете, что не хотите использовать тип BigInteger, было бы полезно, если бы вы могли убедиться, что это не то, что вы хотите, прочитав мой ответ, а затем точно объяснить, почему это не соответствует вашим целям.

Почему вы думаете, что вам нужно вычислять эти факториалы?Практически бесполезно для чего-либо выполнять фактические вычисления.

Просто результат вычисления факториала (2 ^ 32-1) занял бы много места, примерно 16 ГБ.

Сам расчет, конечно, займет много времени.Если вы создадите программу таким образом, чтобы можно было перенести процесс вычислений на более быстрое оборудование по мере его изобретения, вы сможете получить результат в течение всего срока службы.

Если это что-то вроде Эйлер проблема, которую вы пытаетесь решить, учтите, что многие решения можно найти, уточнив, что именно вам на самом деле не нужно вычислять, чтобы получить ответ.

Здесь .Самый быстрый, прямо от Фабриканта - Питера Лушни.

На данный момент вы можете использовать класс BigInteger из библиотек J #. Вот статья о том, как.Это усложняет развертывание, потому что вам приходится отправлять J# распространяемый.Вы также можете рассмотреть возможность перехода в Бета-версия VS2010 как Framework 4.0 будет иметь BigInteger.

В случае, если у вас установлен J # redist, альтернативным способом было бы использование java.math.BigInteger путем добавления ссылки на vjslib сборка.

Попробуйте использовать массив для этой задачи.Вы могли бы использовать целые числа такой длины, какая у вас есть в свободной памяти.Каждый элемент массива представляет собой одну десятичную цифру.Единственное, что вам нужно, это реализовать мультипликацию.

Если вы выполняете вычисления с факториалами, такими как комбинации, например, вам редко нужно умножать все вплоть до 1 (например.98 * 98 * 97 поскольку все остальное сводится на нет).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top