Во-первых, стоит отметить, что факториал uint.MaxValue
является астрономически большой. Я не могу найти хорошую оценку порядка величины своего факториала, но его битовое представление, вероятно, будет занимать высокий процент стандартной ОЗУ, если оно не будет значительно превышать.
Класс A BigInteger
, кажется, является тем, что вы хотите, предоставляя вам всего лишь около 1 000 000 или около того (очень грубо). После этого время и память становятся очень запретительными. В текущих (стабильных) версиях .NET, до 3.5, вам нужно выполнить специальную реализацию. This one в CodeProject, по-видимому, высоко оценен. Если вы собираетесь разрабатывать .NET 4.0, команда Microsoft, наконец, собралась, чтобы включить класс BigInteger
в пространство имен System.Numerics
BCL. В отличие от некоторых реализаций BigInteger, один из существующих в .NET 4.0 не имеет встроенного факториального метода (я не уверен в CodeProject), но это должно быть тривиально для реализации одного - метод расширения был бы приятным путь.
Поскольку вы, кажется, думаете, что не хотите использовать тип BigInteger, было бы полезно, если бы вы могли убедиться, что это не то, что вы хотите, прочитав мой ответ, а затем объясните, почему это не подходит вашему цели.
проблема с факториалом заключается в том, что даже при работе с релятивистами небольшие целые числа, такие как 256, он по-прежнему вычисляет результат, который составляет около 507 цифр, поэтому мне было бы неловко думать, сколько цифр 4294967295! будет yeild. переменные с плавающей запятой не полезны для моего приложения. – Avner
Какое приложение нуждается в этом? Звучит скорее как домашняя проблема CS :) –
Мне все еще интересно, что вы делаете, для чего требуется точное значение (2^32)! В соответствии с этим: http://www47.wolframalpha.com/input/?i=(2^32)! Это около 10^39507966976. Чтобы представить в перспективе, атомы в наблюдаемой вселенной составляют всего около 10^80, поэтому вы смотрите на число около 10^39507966896 раз больше числа атомов в наблюдаемой вселенной. – Davy8