работа с очень большими целыми числами в C # - PullRequest
3 голосов
/ 31 мая 2009

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

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

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

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

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

любая помощь будет принята с благодарностью

Ответы [ 9 ]

10 голосов
/ 31 мая 2009

Для вычисления факториала uint.MaxValue вам потребуется лот хранилища.

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

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

6 голосов
/ 31 мая 2009

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

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

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

5 голосов
/ 31 мая 2009

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

P.S. Что ж, с оптимизированным хранением, скажем, 9 цифр в 4 байта, это займет ~ 18 ГБ ОЗУ.

2 голосов
/ 31 мая 2009

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

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

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

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

1 голос
/ 21 мая 2012

Здесь . Самый быстрый, прямо из Факториального Человека - Петр Лущный.

0 голосов
/ 31 мая 2009

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

0 голосов
/ 31 мая 2009

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

0 голосов
/ 31 мая 2009

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

0 голосов
/ 31 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...