Наиболее эффективная реализация класса большого числа - PullRequest
6 голосов
/ 25 августа 2008

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

Кто-нибудь хочет предложить эффективный алгоритм, как лучше всего это сделать?

Ответы [ 5 ]

12 голосов
/ 25 августа 2008

Есть 2 решения вашей проблемы:

  • Простой способ: Используйте внешнюю библиотеку, такую ​​как ' Библиотека GNU MP Bignum и забудьте о деталях реализации.

  • Трудный путь: Разработайте свой собственный класс / структуру, содержащую несколько типов данных более высокого порядка, таких как переменные типа double или int64, и определите для них базовые математические операции, используя перегрузку операторов (в C ++) или с помощью методов с именами add, subtract, multiply, shift и т. Д. (В JAVA и других OO языки).

Дайте мне знать, если вам понадобится дополнительная помощь. Я делал это пару раз в прошлом.

6 голосов
/ 20 апреля 2010

В C # 4.0 используйте тип BigInteger

4 голосов
/ 08 ноября 2008

Вы спрашиваете о арифметике произвольной точности , предмете, по которому было написано книги . Если вам нужна простая и довольно эффективная библиотека BigNum для C #, вы можете проверить IntX .

4 голосов
/ 25 августа 2008

Использование встроенных функций языка работает для меня.

Java имеет BigInteger и BigDecimal, и Python автоматически переключается на объект, аналогичный Java, если число выходит за пределы диапазона integer или еще чего-нибудь.

Что касается других языков, я понятия не имею.

Я ненавижу заново изобретать колесо.

3 голосов
/ 27 августа 2008

Создать собственную библиотеку BigNum сложно, поэтому я бы сказал, что jjnguy. Используйте все, что предлагает ваш язык в качестве библиотек.

В .net ссылаются на DLL VisualJ, поскольку они содержат классы BigInteger и BigDecimal. Однако вы должны знать о некоторых ограничениях этих библиотек, таких как, например, отсутствие метода квадратного корня.

...