Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6317 / 3041 / 1054
Регистрация: 01.06.2021
Сообщений: 11,588

bigint библиотека для работы с большими целыми числами на С++

10.06.2024, 22:33. Показов 5276. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал библиотеку для работы с большими целыми числами на С++.
Учитывая, что я почти не тестировал все функции, то буду рад, если протестируете и найдете баги.

Основы работы с библиотекой:
Библиотека предлагает два класса BigInt для представления больших чисел и BigFrac для работы с большими обыкновенными дробями.

Примеры ввода, инициализации, объявления больших чисел (разумеется, ниже приведены не все возможные способы, а лишь некоторые):
C++
1
2
3
4
5
6
7
8
9
10
BigInt a; // 0
BigInt b("5");
BigInt c{"-4");
BigInt d = "12";
BigInt e = b;
BigInt f(c);
BigInt g{d};
g = e;
std::string s = "10";
BigInt h{s};
и дробей
C++
1
2
3
4
5
6
BigFrac a; // 0/1
BigFrac b{"2", "3"};
BigFrac c("4", "5");
BigInt d{"-7"};
BigInt e{"9"};
BigFrac f{d, e};
У BigInt есть методы для получения доступа к знаку и значению, которое хранится в виде строки:
C++
1
2
const std::string& get_value() const;
bool get_sign() const;
А у BigFrac для получения доступа к числителю и делителю:
C++
1
2
const BigInt& get_numerator() const;
const BigInt& get_denominator() const;
Чтобы вывести дробь или число можно напрямую писать:

C++
1
std::cout << BigInt("42");
или
C++
1
std::cout << Factorial(100);
или
C++
1
std::cout << BigFrac("1", "3");
Т.е. ostream перегружен, ну вы поняли...

Реализованные функции:

сложение, вычитание, знак минус, умножение, деление, остаток, возведение в степень
можно использовать также операторы +, -, *, /, %, ^, либо с присваиванием += -= *= /= %= ^=
Примечание: Remainder это именно остаток от деления на основе floored definition и отличается от % языка С++ на основе truncated definition. Данная функция больше напоминает на те, что в математических пакетах (Maple, Mathematica, Maxima...).

C++
1
2
3
4
5
6
7
Add(const BigInt& x, const BigInt& y) 
BigInt Subtract(const BigInt& x, const BigInt& y)
BigInt Minus(const BigInt& x)
BigInt Multiply(const BigInt& x, const BigInt& y)
BigInt Divide(const BigInt& x, const BigInt& y)
BigInt Remainder(const BigInt& x, const BigInt& y)
BigInt Pow(const BigInt& x, const int y)
Сравнение чисел (можно также использовать операторы < > <= >= == !=)
C++
1
2
3
4
5
6
bool EqualQ(const BigInt& x, const BigInt& y)
bool NotEqualQ(const BigInt& x, const BigInt& y)
bool GreaterQ(const BigInt& x, const BigInt& y)
bool LessQ(const BigInt& x, const BigInt& y)
bool GreaterEqualQ(const BigInt& x, const BigInt& y)
bool LessEqualQ(const BigInt& x, const BigInt& y)
Другие функции. Мне кажется нет смысла объяснять их предназначение. Если будут вопросы, то пишите в комментариях.
C++
1
2
3
4
5
6
7
8
9
10
11
BigInt Abs(const BigInt&);
BigInt Factorial(const int);
BigInt GCD(const BigInt&, const BigInt&);
BigInt LCM(const BigInt&, const BigInt&);
BigInt ISqrt(const BigInt&);
BigInt Fibonacci(const int);
BigInt Binomial(const int, const int);
bool EvenQ(const BigInt&);
bool OddQ(const BigInt&);
std::size_t IntegerLength(const BigInt&);
std::string Approx(const BigInt&, const std::size_t = 10ull)
Последняя функция Approx позволяет вывести большое число в научной нотации (мантисса и экспонента). Добавил ее, т.к. подумал, что она будет полезна некоторым. Причем, опционально можно выбрать сколько цифр показывать.

Функции для дробей (можно так же использовать операторы):

C++
1
2
3
4
5
6
BigFrac Add(const BigFrac& x, const BigFrac& y)
BigFrac Subtract(const BigFrac& x, const BigFrac& y)
BigFrac Minus(const BigFrac& x)
BigFrac Multiply(const BigFrac& x, const BigFrac& y)
BigFrac Divide(const BigFrac& x, const BigFrac& y)
BigFrac Pow(const BigFrac& x, const int y)
Сравнение дробей
C++
1
2
3
4
5
6
bool EqualQ(const BigFrac& x, const BigFrac& y)
bool NotEqualQ(const BigFrac& x, const BigFrac& y)
bool GreaterQ(const BigFrac& x, const BigFrac& y)
bool LessQ(const BigFrac& x, const BigFrac& y)
bool GreaterEqualQ(const BigFrac& x, const BigFrac& y)
bool LessEqualQ(const BigFrac& x, const BigFrac& y)
Другие функции
C++
1
2
3
BigFrac Abs(const BigFrac&);
BigFrac Harmonic(const int);
std::string Approx(const BigFrac&);
Для дробей тоже добавил Approx, которая показывает значение дроби в научной нотации.

P.S. Спасибо форумчанам DrOffset, TheCalligrapher, Алексей1153 и другим, которые помогли советами...
Вложения
Тип файла: zip bigint.zip (30.2 Кб, 26 просмотров)
3
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.06.2024, 22:33
Ответы с готовыми решениями:

Библиотека для работы с большими целыми числами
Кто то может подскажет, есть ли к Pure библиотека для работы с большими целыми числами (более 64 бит)? Не хочется изобретать велосипед....

Калькулятор для работы с большими целыми числами
Длинные целые числа. Описать класс для представления длинных целых чисел. Реализовать методы задания числа, распечатки, сложения с...

Библиотека для работы с большими числами
Доброго времени суток, комрады! Для работы с большими числами есть библиотека GMP.h. Скачал архив по ссылке https://gmplib.org/. Далее...

69
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.06.2024, 19:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Donkix Посмотреть сообщение
команда -lbigint к строке компоновщика
Вообще говоря, это вот и есть подключение библиотеки. Если на момент написания сообщения #16 этого не было, то все эти телодвижения со сменой компилятора и т.п. были напрасны.
0
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 1
11.06.2024, 20:05
DrOffset, Ну, проверив в том, что и так было, смена самой ide была не напрасна

Добавлено через 1 минуту
DrOffset, а можно ли подключить стороннюю либу просто закинув ее содержимое в внутрь ide?

Добавлено через 33 секунды
Что бы это было, как тот же iostream встроенный
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.06.2024, 20:28
Цитата Сообщение от Donkix Посмотреть сообщение
смена самой ide была не напрасна
Действия должны быть осмысленными. Если вам нужно закрутить винт, не нужно прыгать вокруг него с бубном, нужно взять отвертку и начать крутить. Даже если потом окажется, что разминка с бубном была не напрасна и вы этим сняли спазмы спины, что в итоге помогло вам закрутить его легче.

Цитата Сообщение от Donkix Посмотреть сообщение
Что бы это было, как тот же iostream встроенный
Для iostream просто неявно настроено, что-то вроде вот этого -lstdс++, подключение библиотеки libstdc++.a
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.06.2024, 20:48
Donkix,
вот смотрите сюда: https://wandbox.org/permlink/0s0T1pEu0lVwR7vy
пустая программа, добавил при компиляции ключ -v, чтобы показать опции по умолчанию.
спускаемся вниз обширного вывода и видим:

Вот они родненькие библиотеки по умолчанию:
-lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgc
никакой магии. Реализация iostream находится в libstdc++.
1
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,427
12.06.2024, 17:12
В ++ пустая программа не компилится только в бейсике, лиспе и иже с ними.
С недоприлинкованной либой повеселило. Народец хлипкий, наркоманит невежеством.. причем и те и эти.
Инициализировать число строкой - навевает на печальные мысли, что контейнер внутри строка. Может и нет, но если да, то все.
В итоге я так и не понял при чем тут с++ и начинающие это в тестирование годится.
0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,295
12.06.2024, 17:29
vlisp, отсыпь
0
12.06.2024, 17:39  [ТС]

Не по теме:

Цитата Сообщение от vlisp Посмотреть сообщение
контейнер внутри строка
нет, там Maersk

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
12.06.2024, 17:44
Цитата Сообщение от vlisp Посмотреть сообщение
В ++ пустая программа не компилится[,] только в бейсике, лиспе и иже с ними.
Запятая что ли пропущена?

Вы дальше первого слова вообще читали? Контекст поста поняли?
1
12.06.2024, 17:53  [ТС]

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Запятая что ли пропущена?
ему можно и не ставить

Профессорам химии разрешено же говорить атóм вместо а́том. Но обычные смертные так говорить не могут.
Тут аналогично. Те, кто с самого рождения знает, как линковать библиотеку, могут писать, как хотят и что хотят, главное, что другие (из той же песочницы) их поймут.
Законы Вселенной.

0
12.06.2024, 18:03

Не по теме:

Цитата Сообщение от vlisp Посмотреть сообщение
пустая программа не компилится
Бугага. Она-то скомпилится, но не слинкуется при использовании стандартного рантайма (но и это поправимо - задай точку входа пустую и все слинкуется).
Ты сказать-то что хотел, друже? При чем тут программа пустая, ты тему читал вообще?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.06.2024, 18:03

разработать класс реализующий методы для работы с большими целыми числами
разработать класс реализующий методы для работы с большими целыми числами (умножение, сложение, вычитание) Добавлено через 3 минуты ...

MIRACL библиотека для работы с большими числами
У меня была готовая программа с консолью и ее исходники. Когда я переписывал ее под программу с формой появилась проблема. Дело в том, что...

Библиотека для работы с большими числами, возможность факторизации
Привет всем! Какие библиотеки можете посоветовать для работы с большими числами, с возможностью их факторизации. Хотелось бы иметь...

Разработать структуру “bigint” для выполнения операций с целыми числами содержащими произвольное количество знаков
Нужна помощь с си! Это срочно, у меня получилось сделать часть, но дальше не получается. Пожалуйста, помогите. Я надеюсь , что здесь...

Разработать тип данных “bigint” для выполнения операций с целыми числами содержащими произвольное количество знаков
Разработать собственный тип данных (структуру) “bigint” для выполнения операций с целыми числами содержащими произвольное количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
70
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru