Другие языки программирования и технологии

Есть задача о представлении чисел. Как бы вы её решили?

Мне не нужен конкретный пример, т.е. код. Теоретически, если нужно работать с числами которые превышают допустимые представления для типа int. И условие можно использовать только int тип. Как бы вы это решили?
.
Под работой с такими числами я понимаю их вывод на экран, и орифметические операции с ними. На у м приходит например если не хватает одной переменно Int то использовать две переменные(как бы больше значений можно представить но как с ними работать)
Lubov Mesenceva
Lubov Mesenceva
303
Практически в каждом мейнстримном языке есть целочисленный тип повышенной точности с оптимизированными операциями для него.
  • для C/C++ есть библиотека GNU MPZ;
  • в Питоне инт и так безразмерный (но и весит 24 байта + 4-байтные инкременты);
  • в Java есть BigInteger, даже с кое-какими оптимизациями, по крайней мере, Карацуба и Тум-Кук в нём точно реализованы.

Я даже сам когда-то делал такой тип. У меня была крутая реализация на шаблонах C++, со статически известным размером, без ветвлений. Впрочем, это было её единственным достоинством. Факториал от 2000 она считала секунды полторы (для сравнения, Питоновский math вычисляет его за доли секунды на таком же железе). В нём 5736 десятичных цифр или 19053 бита.

И вторая большая проблема - переводить числа в десятичную форму для вывода на экран, в файлы, в БД и т.п. В лоб делать, как школьники (в цикле поделить на 10, взять остаток) - очень затратно, деление же медленное, а тут ещё каждый раз приходится делить всё число, операцию никак не декомпозируешь. Тот же самый факториал 2000 переводился в строку где-то полминуты. В несколько раз удалось ускорить таким трюком: делим число на 10 в 18-й степени (максимальная степень 10, влезающая в 64 бита), получаем 18-значные числа, которые обрабатываем уже обычными делениями, каждое из которых - одна процессорная операция divmod на регистрах. Но всё равно, до скорости Питоновской реализации осталось, как до Луны пешком.

В общем, в самопальных реализациях смысла нет, арифметика повышенной точности - это серьёзная задача.
Jaroslav Петруняк
54 053
Лучший ответ
Скорее всего я б эту задачу никак не решал
Vasiliy Kachesov
Vasiliy Kachesov
20 491
Ну сделай так - пусть число будет представлено как массив int. Каждый int это цифра числа (в 2^31-1 ричной системе). Соответственно сразу очевидно как складывать, умножать и вычитать. Про деление нужно будет отдельно погуглить (тебе).
О чем речь? О выводе на экран сверхбольших чисел? Они обычно выводятся на экран в экспоненциальной записи. Например триллион компьютер вряд ли выдаст как 1000000000000. Он вместо этого напечатает лаконичное 1e+12

Похожие вопросы