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

