15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Большие числа

Автор: Селин Дмитрий

Часто на олимпиадах встречаются задачи типа сложить два 50-значных числа, или посчитать 2 в 95-ой степени. Да и вообще задачи такого типа весьма популярны. Нашей группе на летней практике попалось решение квадратных уравнений с произвольными (в смысле величины) коэффициентами.

Идея решения состоит в создании собственного типа данных на основании массива, каждый элемент которого - цифра исходного длинного числа. Потом для этого типа данных определяются процедуры сложения, вычитания, умножения и что еще надо для решения конкретной задачи.

Для решения своей задачи я создал эдакий класс, перегрузил для него кучу операторов (+,-,*,/,<,>,<< ...), написал функцию sqrt. В классе два массива - один содержит цифры целой части, другой - цифры дробной. Для экономии места каждый байт содержит две цифры.

Потом я решил сделать его более универсальным. Результат этой попытки вы можете здесь лицезреть. Хотя я думаю многие программисты уже встречались с такой задачей, и вообще каждому полезно будет самому создать нечто подобное, но данный пример представляет интерес прежде всего как ПРИМЕР. И те кто ни разу не сталкивался ни с чем подобным, могут взять его за основу для своих проектов.

И imho это довольно сносный пример перегрузки операторов и создания собственных типов данных. а теперь минусы: не определен перевод из double в этот тип, довольно плохо отлажена, вывод только в поток ostream, процедуры не совсем оптимально реализованы.

В архиве лежат также и тесты на которых это все тестировалось. Для использования в Вашей программе, включите #include "LNum.h" , обьявляйте переменные CLNum a,b и пользуйтесь. Можно пользоваться приведением int a; CLNum b=(CLNum)a;

Скачать демонстрационный проект с исходником (Visual C++ 6.0) - 26 Kb