2009-08-12 2 views
4

Я пытаюсь вычислить 100! и, похоже, не существует встроенной факториальной функции. Итак, я написал:Значение больше ULong? Вычисление 100!

Protected Sub ComputeFactorial(ByVal n As ULong) 
     Dim factorial As ULong = 1 
     Dim i As Integer 
     For i = 1 To n 
      factorial = factorial * i 
     Next 
     lblAnswer.Text = factorial 
    End Sub 

К сожалению, работает это со значением 100 для п rseults в

Значение было либо слишком большой или слишком маленький для uint64.

Итак, существует ли больший тип данных для хранения чисел? Я ошибаюсь в своих методах? Я беспомощна?

+1

Почему бы вам не воспользоваться этой возможностью и написать класс bigint? Это немного больше в духе проекта Эйлера ... :) – Guffa

+0

Для справки: \t 100! ~ = 9.33262154 × 10^157 – Robert

+0

@ Guffa, если бы я только знал, с чего начать, hahah – Chris

ответ

7

Звучит как Project Euler.

В .NET 4.0 System.Numerics.BigInteger, или вы можете подобрать довольно сладкую реализацию здесь:
C# BigInteger Class

Edit: treed :(

Я добавлю - версию на CodeProject имеет дополнительные функции, такие как целочисленный квадратный корень, тест примитивности, генерация последовательности Lucas. Кроме того, у вас нет прямого доступа к буферу в реализации .NET, который раздражал пару вещей, которые я пытался.

+0

Действительно, Project Euler! Полагаю, мне придется пойти с одним из этих классов. Довольно неудачно! – Chris

+0

Не расстраивайтесь - я использовал один из CodeProject, когда я поставил около 80 проблем за 7 дней. Я остановился вскоре после - глупый ДОБАВИТЬ. : o –

0

Вам нужна реализация «BigNums». Это целые числа, которые динамически распределяют память, чтобы они могли удерживать свое значение.

A версия был фактически cut from the BCL.

Библиотека J # имеет реализацию java.math.BigInteger, которую вы можете использовать с любого языка.

В качестве альтернативы, если точность/точность не являются проблемой (вы только заботитесь о порядке величины), вы можете просто использовать 64-битные поплавки.

0

decimal will от 0 до +/- 79,228,162,514,264,3 37 593 543 950 335 без десятичной точки (шкала нуля)

+0

Значение было либо слишком большим, либо слишком маленьким для десятичного числа. – Chris

1

Подсказка: используйте массив для хранения цифр номера. По проверке можно проверить, что результат не будет содержать более 200 цифр.

Смежные вопросы