Я пытаюсь подумать о том, как бы я делал вычисления для чрезвычайно больших чисел (до бесконечности - без целых чисел), если языковая конструкция не способна обрабатывать числа, превышающие определенное значение.
Я уверен, что я не первый и не последний, кто задает этот вопрос, но используемые мной поисковые термины не дают мне алгоритма для решения этих ситуаций. Скорее большинство предложений предлагают изменение языка или изменение переменной, или говорят о вещах, которые кажутся не относящимися к моему поиску. Так что мне нужно немного руководства.
Я бы набросал алгоритм так:
Определите максимальную длину целочисленной переменной для языка.
Если число больше половины длины максимальной длины переменной, разбейте ее на массив. (дать небольшую игровую комнату)
Порядок массива [0] = наиболее правые числа [n-max] = наиболее левые числа
Ex. Num: 29392023 Массив [0]: 23, Массив [1]: 20, массив [2]: 39, массив [3]: 29
Поскольку я установил половину длины переменной в качестве точки разметки, я могу затем вычислить единицы, десятые, сотые и т. Д. Поместить через полпути так, чтобы, если максимальная длина переменной составляла 10 цифр от 0 до 9999999999, я знал, что наполовину до пяти цифр дайте мне немного игровой комнаты.
Поэтому, если я добавлю или умножу, у меня может быть функция проверки переменных, которая видит, что шестая цифра (справа) массива [0] находится в том же месте, что и первая цифра (справа) массива [1].
У деления и вычитания есть свои проблемы, о которых я еще не думал.
Я хотел бы знать о лучших реализациях поддержки больших чисел, чем программа может.
источник
Ответы:
Вы ищете библиотеку арифметики произвольной точности (также называемую «множественной точностью» или «большим числом») для языка, с которым вы работаете. Например, если вы работаете с C, вы можете использовать библиотеку GNU Bignum -> http://gmplib.org/
Если вы хотите понять, как это работает, вы также можете написать свою собственную большую библиотеку num и использовать ее. Самый простой способ справиться с этим - использовать массивы, где каждый элемент является цифрой числа, с которым вы работаете. После этого вам нужно реализовать все функции для сложения, вычитания, умножения, деления, возведения в степень и так далее.
источник
Это хорошо известная проблема: арифметика произвольной точности
Если используемый вами язык не решает эту проблему, сначала попробуйте найти стороннюю библиотеку, которая это делает. Если вы не нашли его или вам любопытно, попробуйте реализовать его; В статье Википедии есть хорошие ссылки на классические реализации.
источник
При работе с большими числами, вероятно, одно из самых фундаментальных проектных решений - как я собираюсь представлять большое число?
Будет ли это строка, массив, список или пользовательский (доморощенный) класс хранения.
После того, как это решение принято, фактические математические операции могут быть разбиты на более мелкие части и затем выполнены с типами родного языка, такими как int или integer.
Я включил очень простой пример ADDITION в C # .Net, который хранит полученное большое число в виде строки. Входящие «числа» также являются строками, поэтому нужно иметь возможность отправлять очень «большие» числа. Имейте в виду, что пример только для целых чисел, чтобы сделать его простым.
Даже со строками есть ограничение на количество символов или «цифр» в числе, как указано здесь:
Какова максимально возможная длина строки .NET?
Но вы можете добавить несколько действительно больших чисел, выходящих за рамки собственных типов int32 или int64 для .Net.
В любом случае, вот реализация хранилища строк.
Я надеюсь, что это даст вам некоторые идеи относительно вашей собственной реализации. Обратите внимание, что пример кода, вероятно, не оптимизирован или что-то в этом роде. Это должно дать некоторые идеи о том, как это можно сделать.
источник
Этот работает быстрее для меня:
источник