Хранение и печать целочисленных значений больше 2^64
Я пытаюсь написать программу для нахождения простых чисел Мерсенна. Используя тип unsigned long long, я смог определить значение девятого простого числа Мерсенна, которое равно (2^61)-1. Для больших значений мне понадобится тип данных, который может хранить целочисленные значения больше 2^64. Пожалуйста помоги. (Я должен иметь возможность использовать операторы, такие как ,=,>,<и% с этим типом данных.)
6 ответов
Вы не можете делать то, что хотите, с типами C natives, однако есть библиотеки, которые позволяют обрабатывать произвольно большие числа, например, GNU Multiple Precision.
Для хранения больших чисел существует множество вариантов, которые приведены ниже в порядке убывания предпочтений:
1) Используйте сторонние библиотеки, разработанные другими на github, codeflex и т. Д. Для вашего упомянутого языка, то есть C.
2) Переключитесь на другие языки, такие как Python, который имеет встроенные возможности обработки большого числа, Java, который поддерживает BigNum, или C++.
3) Разработайте свои собственные структуры данных, возможно, в терминах строк (где длина 100 символов может относиться к 100 десятичным цифрам) с его пользовательскими операциями, такими как сложение, вычитание, умножение и т. Д., Так же как библиотека комплексных чисел в C++ была разработана таким образом., Этот выбор может быть предназначен для ваших исследований и образовательных целей.
Все эти люди в основном говорят о том, что 64-битный процессор не сможет добавлять эти огромные числа только с помощью инструкции, но вам скорее нужен алгоритм, который сможет добавить эти числа. Такой алгоритм должен был бы обрабатывать 2 числа по частям.
И библиотеки, которые они перечислили, позволят вам сделать это, хорошим упражнением будет разработка одной из них (просто алгоритм / функция, чтобы узнать, как это делается).
Не существует стандартного способа иметь тип данных больше 64 бит. Вы должны проверить документацию своих систем, некоторые из них определяют 128-битные целые числа. Однако, чтобы действительно иметь целые числа гибкого размера, вы должны использовать другое представление, например, массив. Затем вы должны определить операторов =
, <
, >
, так далее.
К счастью, такие библиотеки, как GMP, позволяют использовать целые числа произвольной длины.