-
Автор темы
- #1
Длинная арифметика - не только очень важная часть при создании крупных проектов, но и однин из разделов олимпиадного программирования. Часто в задачах стоит цель далеко не только реализовать, например, сложение чисел N-ной длины, требуется произвести еще и некоторые сложные действия, на которые как раз и делается упор. Тратить свое время на реализацию первичных алгоритмов не всегда хочется, поэтому на большинстве олимпиад, к счастью, разрешено пользоваться некоторыми своими наработками.
Я решил поделиться с вами своим первым классом по работе с длинной арифметикой. Если увижу отдачу - опубликую и последующие версии с нормальными оптимизациями :).
Реализация.
Любые алгоритмы по длинной арифметике основаны на использовании массива, в качестве "хранилища" для переменной. Зачастую используются строки, из-за простоты в работе. Для начала можно использовать обычные "школьные" методы умножения/деления, а потом уже переходить к более сложным и быстрым, например, умножение в хороших классах сделано через алгоритм Карацубы.
Сложение, вычитание и умножение я делал в столбик, деление уже частично основано на бинпоиске по ответу.
Класс для работы.
Файл large.hpp можно скачать с моего репозитория на GutHub'е:
Основной функционал.
Пример использования.
Напишем небольшую программу-калькулятор с использованием моего класса.
Попрактиковаться можно на простейших задачках с сайта Informatics: №130-142, №2798
Я решил поделиться с вами своим первым классом по работе с длинной арифметикой. Если увижу отдачу - опубликую и последующие версии с нормальными оптимизациями :).
Реализация.
Любые алгоритмы по длинной арифметике основаны на использовании массива, в качестве "хранилища" для переменной. Зачастую используются строки, из-за простоты в работе. Для начала можно использовать обычные "школьные" методы умножения/деления, а потом уже переходить к более сложным и быстрым, например, умножение в хороших классах сделано через алгоритм Карацубы.
Сложение, вычитание и умножение я делал в столбик, деление уже частично основано на бинпоиске по ответу.
Класс для работы.
Файл large.hpp можно скачать с моего репозитория на GutHub'е:
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Там же находится и пример использования, который я рассмотрю в теме чуть позже.Основной функционал.
- Сложение
- Вычитание
- Умножение
- Деление
- Остаток от деления
- Возведение в степень
- Перевод в строку без/со знаком
- Постфиксные инкремент и декремент
- Различные операторы присваивания
long long
, string
и стандартный - 0.Пример использования.
Напишем небольшую программу-калькулятор с использованием моего класса.
C++:
#include <iostream>
#include <conio.h>
#include "large.hpp"
int main() {
setlocale(LC_ALL, "RU");
string num1, num2;
cout << "Первое число: ";
getline(cin, num1);
cout << "Первое число: ";
getline(cin, num2);
cout << "\nСумма: " << (large(num1) + large(num2)).ToString() << endl;
cout << "Разность: " << (large(num1) - large(num2)).ToString() << endl;
cout << "Произведение: " << (large(num1) * large(num2)).ToString() << endl;
cout << "Частное: " << (large(num1) / large(num2)).ToString() << endl;
cout << "Остаток от деления: " << (large(num1) % large(num2)).ToString() << endl;
cout << "A в степени B: " << (large(num1).pow(large(num2))).ToString() << endl;
_getch();
}