Какой язык программирования позволит мне вводить очень длинные числа без преобразования их в числа с плавающей запятой? - PullRequest
4 голосов
/ 31 октября 2009

Как лучше всего сделать следующее.

Введите очень длинное число, скажем, 500 000 цифр без его включения в научную нотацию; а затем я могу сделать с ним математику, например, +2 и т. д.

Заранее спасибо.

РЕДАКТИРОВАТЬ: это 500 000 цифр, положительное целое число.

Ответы [ 14 ]

12 голосов
/ 31 октября 2009

Python и Java имеют встроенную поддержку, библиотеки существуют для C ++ , C , .NET , ...

10 голосов
/ 31 октября 2009

Я знаю, что Эрланг поддерживает неограниченный размер в арифметике.

6 голосов
/ 31 октября 2009

Python делает это из коробки без специальной библиотеки. То же самое относится и к «bc» (это полный язык программирования, маскирующийся под калькулятор) для систем Unix.

5 голосов
/ 31 октября 2009

Python довольно хорош сам по себе, но лучше с gmpy (что связывает его с библиотекой GMP, о которой упоминали другие, или, альтернативно, с MPIR, своего рода похожим на работу [[work in прогресс;-)]]). Рассмотрим:

$ python -mtimeit -s'x=int("1"*9999); y=int("2"*9999)' 'x*y'
100 loops, best of 3: 6.46 msec per loop

т. Е. В чистом Python умножение двух 10-разрядных чисел занимает 6,5 миллисекунды или около того. И ...:

$ python -mtimeit -s'from gmpy import mpz; x=mpz("1"*9999); y=mpz("2"*9999)' 'x*y'
1000 loops, best of 3: 326 usec per loop

... с gmpy под рукой операция будет примерно в 20 раз быстрее. Если у вас есть сотни, а не тысячи цифр, это еще более экстремально:

$ python -mtimeit -s'x=int("1"*199999); y=int("2"*199999)' 'x*y'
10 loops, best of 3: 675 msec per loop

против

$ python -mtimeit -s'from gmpy import mpz; x=mpz("1"*199999); y=mpz("2"*199999)' 'x*y'
100 loops, best of 3: 17.8 msec per loop

итак, с цифрой 200k вместо 10k, преимущество gmpy в скорости составляет примерно 38 раз.

Если вам обычно нужно обрабатывать целые числа этой величины, Python + gmpy действительно работоспособное решение (конечно, я предвзят, поскольку я писал и ухаживаю за gmpy в течение последних нескольких лет именно потому, что я ♥ Python (эй мой номерной знак - это P ♥ thon! -) и в одном из моих хобби (комбинаторная арифметика). Мне do приходится иметь дело с такими числами довольно часто; -.)

4 голосов
/ 31 октября 2009

Common Lisp также имеет встроенную поддержку произвольных больших чисел ...

4 голосов
/ 31 октября 2009

Haskell (при использовании GHC) также имеет встроенную поддержку произвольно длинных целых чисел. Вот фрагмент, показывающий длину числа, преобразованного в строку.

Prelude> length $ show $ 10
2
Prelude> length $ show $ 1 + 2^2000000
602060
Prelude> let x = 2^200000
Prelude> let y = 2^200000 + 5
Prelude> y - x
5

Или вы можете просто набрать 2^200000 на интерактивной консоли и подождать пару минут, пока она напечатает все символы 600k +. Я подумал, что этот способ немного проще продемонстрировать.

4 голосов
/ 31 октября 2009

Mathematica позволяет вам делать такую ​​математику, и вы можете писать в ней полные программы.

В противном случае вам нужна «библиотека» для расширения встроенной функциональности другого языка программирования, такого как Python или Java.

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

3 голосов
/ 31 октября 2009

То, что вы ищете, это не обязательно язык, а библиотека произвольной точности.

GMP будет быстрой реализацией в C / C ++, и языки сценариев, которые обрабатывают большие целые числа, вероятно, будут использовать что-то подобное.

3 голосов
/ 31 октября 2009

Perl, Python, Ruby и Java могут сделать это. Внешние библиотеки существуют для всего остального.

Мне скорее нравятся Ruby и Python, потому что они автоматически переключаются с Fixnum на Bignum. (Python: int до long.)

3 голосов
/ 31 октября 2009

В Perl есть модуль bignum для таких целей, и Python поддерживает его изначально.

...