Я написал программу на Delphi - простой калькулятор для вычислений с целыми числами любого размера (мне захотелось написать такую программу, чтобы разобраться с RSA-шифрованием). Предлагаю пораскинуть мозгами, какой должен быть алгоритм для такой программы при правильном программировании. Опишу что написал, но сознательно не буду цитировать свой код, потому что тема скорее не программистская а математическая или может быть философская.
Ясно, что каждое такое число должно быть динамическим массивом. Я сделал десятичные числа, т.е. каждый элемент массива это цифра от 0 до 9.
Всем понятно, как сделать сложение двух таких чисел - один прогон цикла от последней цифры справа до крайней цифры слева у большего числа. Сделать умножение чуть сложнее, и здесь уже возникает такой вопрос - если мы говорим что "оптимизацией мы можем особо не заморачиваться", до какого предела этот принцип можно притворять в жизнь. Скажем, самый простой алгоритм умножения A на B - взять 0 и прибавлять к нему B, и так A раз. Но понятно что если мы будем работать с числами длиной 200 байт (какие используются в RSA шифровании), то с таким алгоритмом умножение двух чисел займёт тысячу лет. Значит в какой-то степени придётся всё-таки "заморочиться" с оптимизацией.
И тут я могу сказать, что мой опыт говорит, что для оптимизации сложных алгоритмов бывает важно не делать никакую низкоуровневую оптимизацию. Дело в том что сложный алгоритм надо писать без ошибок, оптимизация повышает вероятность ошибок, поэтому писать надо максимально структурированный код - разбивая код на отдельные "ортогональные" фрагменты, упакованные например в классы. Проиллюстрирую это описанием своего алгоритма умножения чисел: с ним чуть-чуть падает скорость из-за всяких присвоений от одного объекта к другому, но это мелочь, а важнее чтобы алгоритм был максимально понятен (это тоже причина почему я под спойлером пишу текст а не код - понятный алгоритм можно выразить словами а не кодом, подобно тому как в хорошем научпопе автор пытается по возможности вместо формул писать текстом):
(Оффтоп)
Чтобы умножить A на B, делаем прогон цикла по всем цифрам A; берём цифру, умножаем на неё B (это значит что надо добавить функцию - умножение длинного числа на одну цифру от 0 до 9, это один цикл), далее сдвигаем разряды у произведения влево на номер цифры считая справа (это значит что надо добавить функцию shl, по сути умножение числа на 10 в степени n), и это всё суммируем. Итоговая сумма будет искомым произведениием.
Позже напишу свой алгоритм для деления, предлагаю пока подумать как он должен выглядеть.