Большие числа
Автор: Селин Дмитрий
Часто на олимпиадах встречаются
задачи типа сложить два 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
|