Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/50: Рейтинг темы: голосов - 50, средняя оценка - 4.60
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993

Посоветуйте функции для арифметики больших целых чисел

06.06.2024, 22:40. Показов 10853. Ответов 166
Метки нет (Все метки)

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

Пока что реализовал следующие функции:

C++
1
2
3
4
5
6
7
8
9
10
11
12
std::string Add(const std::string&, const std::string&);
std::string Subtract(const std::string&, const std::string&);
std::string Multiply(const std::string&, const std::string&);
std::string Divide(const std::string&, const std::string&);
std::string Remainder(const std::string&, const std::string&);
std::string Power(const std::string&, const int);
std::string Factorial(const int);
std::string GCD(const std::string&, const std::string&);
std::string LCM(const std::string&, const std::string&);
std::string Abs(const std::string&);
std::string ISqrt(const std::string&);
std::string Fibonacci(const int);
Все эти функции работают с очень большими числами.
Что еще можете посоветовать? Какие важные функции я упустил?
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.06.2024, 22:40
Ответы с готовыми решениями:

Ограничения VBA в реализации арифметики длинных (больших) чисел
Итак, моя юбилейная - первая тема на этом форуме. Здравствуйте Товарищи! Необходима помощь или совет от спецов этого форума. Работаю над...

Быстрая сортировка массива целых чисел, с использованием указателей и адресной арифметики
# include <stdio.h> # include <stdlib.h> void QuickSort(int *a, int size){ int *left = a; // Адрес 1 элемента int *right...

Написать шаблоны функций для для вычисления суммы произведений двух соседних чисел для трех целых чисел и в одномерном массиве целых чисел
Написать шаблоны функций для для вычисления суммы произведений двух соседних чисел для трех целых чисел и в одномерном массиве целых чисел:...

166
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,113
10.06.2024, 00:59
Студворк — интернет-сервис помощи студентам
Ну да. Мощно написано.
0
10.06.2024, 01:07

Не по теме:

Код полезный не хотите ли?
Комменты из .cpp файла убирает.
Я тоже думал ерунда. А работает.
Волшебство си.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#pragma warning(disable : 4996)
 
 
 
int main() {
    FILE *fileIn = fopen("input.txt", "r");
    FILE *fileOut = fopen("output.txt", "w");
    char buf[BUFSIZ];
    int inside = 0;
 
    if (!fileIn || !fileOut)
        return 1;
 
    while (fgets(buf, sizeof(buf), fileIn)) {
        for (char *p = buf; *p; p++) {
            if (!inside) {
                if (*p == '/' && *(p + 1) == '/') {
                    fputc('\n', fileOut);
                    break;
                }
                if (*p == '/' && *(p + 1) == '*') {
                    inside = 1;
                    p++;
                }
                else
                    fputc(*p, fileOut);
            }
            else if (*p == '*' && *(p + 1) == '/') {
                p++;
                inside = 0;
            }
        }
    }
 
    fclose(fileIn);
    fclose(fileOut);
 
    printf("\n");
}
Не я писал. Правильный человек.
Что то я его не вижу больше.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 01:13  [ТС]
TheCalligrapher, если я использую семейство std::stof, std::stod, std::stold, то какова вероятность, что точка в строке может не распознаваться?
Просто прочел, что
decimal floating-point expression. It consists of the following parts:
(optional) plus or minus sign
nonempty sequence of decimal digits optionally containing decimal-point character (as determined by the current C locale) (defines significand)
(optional) e or E followed with optional minus or plus sign and nonempty sequence of decimal digits (defines exponent to base 10)
в моих строках используется точка. глючные локали не использую
на моей ОС десятичный разделитель это запятая, однако код у меня работает

Добавлено через 2 минуты
Наталья8, почему тебе не завести блог на форуме, как вот я сделал? Там можешь коды публиковать, а мы будем их брать

Добавлено через 1 минуту
Цитата Сообщение от Наталья8 Посмотреть сообщение
Ну да. Мощно написано.
еще больше стало
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#pragma once
 
#include <iostream>
#include <string>
 
class BigInt
{
private:
    std::string value = "0";
    bool sign = false;
public:
    BigInt()=default;
    BigInt(const std::string&);
    BigInt(std::string&&);
    BigInt(const char*);
 
    BigInt& operator=(const char*);
    BigInt& operator+=(const BigInt&);
    BigInt& operator-=(const BigInt&);
    BigInt& operator*=(const BigInt&);
    BigInt& operator/=(const BigInt&);
    BigInt& operator%=(const BigInt&);
    BigInt& operator^=(const int);
 
    const std::string& get_value() const;
    bool get_sign() const;
    
    friend std::ostream& operator<<(std::ostream&, const BigInt&);
 
    friend BigInt operator+(const BigInt&, const BigInt&);
    friend BigInt operator-(const BigInt&, const BigInt&);
    friend BigInt operator-(const BigInt&);
    friend BigInt operator*(const BigInt&, const BigInt&);
    friend BigInt operator/(const BigInt&, const BigInt&);
    friend BigInt operator%(const BigInt&, const BigInt&);
    friend BigInt operator^(const BigInt&, const int);
 
    friend bool operator>=(const BigInt&, const BigInt&);
    friend bool operator<=(const BigInt&, const BigInt&);
    friend bool operator==(const BigInt&, const BigInt&);
    friend bool operator!=(const BigInt&, const BigInt&);
    friend bool operator>(const BigInt&, const BigInt&);
    friend bool operator<(const BigInt&, const BigInt&);
    
    friend BigInt Abs(const BigInt&);
    friend BigInt Factorial(const int);
    friend BigInt GCD(const BigInt&, const BigInt&);
    friend BigInt LCM(const BigInt&, const BigInt&);
    friend BigInt ISqrt(const BigInt&);
    friend BigInt Fibonacci(const int);
    friend std::string Approx(const BigInt&, const std::size_t);
};
 
inline BigInt Add(const BigInt& x, const BigInt& y){return x + y;}
inline BigInt Subtract(const BigInt& x, const BigInt& y){return x - y;}
inline BigInt Minus(const BigInt& x){return -x;}
inline BigInt Multiply(const BigInt& x, const BigInt& y){return x * y;}
inline BigInt Divide(const BigInt& x, const BigInt& y){return x / y;}
inline BigInt Remainder(const BigInt& x, const BigInt& y){return x % y;}
inline BigInt Pow(const BigInt& x, const int y){return x ^ y;}
 
inline bool EqualQ(const BigInt& x, const BigInt& y){return x == y;}
inline bool NotEqualQ(const BigInt& x, const BigInt& y){return x != y;}
inline bool GreaterQ(const BigInt& x, const BigInt& y){return x > y;}
inline bool LessQ(const BigInt& x, const BigInt& y){return x < y;}
inline bool GreaterEqualQ(const BigInt& x, const BigInt& y){return x >= y;}
inline bool LessEqualQ(const BigInt& x, const BigInt& y){return x <= y;}
 
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);
std::string Approx(const BigInt&, const std::size_t = 10ull);
 
class BigFrac
{
    BigInt num;
    BigInt denom{"1"};
public:
    BigFrac()=default;
    BigFrac(const BigInt&, const BigInt&);
 
    const BigInt& get_numerator() const;
    const BigInt& get_denominator() const;
 
    friend std::ostream& operator<<(std::ostream&, const BigFrac&);
 
    BigFrac& operator+=(const BigFrac&);
    BigFrac& operator-=(const BigFrac&);
    BigFrac& operator*=(const BigFrac&);
    BigFrac& operator/=(const BigFrac&);
    BigFrac& operator^=(const int);
 
    friend BigFrac operator+(const BigFrac&, const BigFrac&);
    friend BigFrac operator-(const BigFrac&, const BigFrac&);
    friend BigFrac operator-(const BigFrac&);
    friend BigFrac operator*(const BigFrac&, const BigFrac&);
    friend BigFrac operator/(const BigFrac&, const BigFrac&);
    friend BigFrac operator^(const BigFrac&, const int);
 
    friend BigFrac Abs(const BigFrac&);
    friend std::string Approx(const BigFrac&);
};
 
inline BigFrac Add(const BigFrac& x, const BigFrac& y){return x + y;}
inline BigFrac Subtract(const BigFrac& x, const BigFrac& y){return x - y;}
inline BigFrac Minus(const BigFrac& x){return -x;}
inline BigFrac Multiply(const BigFrac& x, const BigFrac& y){return x * y;}
inline BigFrac Divide(const BigFrac& x, const BigFrac& y){return x / y;}
inline BigFrac Pow(const BigFrac& x, const int y){return x ^ y;}
 
BigFrac Abs(const BigFrac&);
std::string Approx(const BigFrac&);
0
фрилансер
 Аватар для Алексей1153
6472 / 5691 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
10.06.2024, 04:40
Цитата Сообщение от SmallEvil Посмотреть сообщение
содержания ноль
чё это? Человек вникает. Нормальный процесс практического опыта

Добавлено через 6 минут
Royal_X, теперь можно и тестирование прилепить. Вот такая идея:

генерируем числа типа int, кладём их в переменные типа long (чтобы переполнения не было при вычислениях)
(предварительно убеждаемся, что static_assert(sizeof(int) < sizeof(long));)

для всех операций и функций класса BigInt производим вычисления и сравниваем с результатом нативных вычислений над long-переменными

и рандомно в течение минуты пусть лупасит

отдельно вручную надо подставить всякие экстремальные варианты, ведь не факт, что они рандомно выпадут.
(например, деление ноля на ноль,)

-------------------------------
А потом и для дробного класса что-то подобное с участием double и сравнением с какой-то точностью
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 14:28  [ТС]
Алексей1153, добавлю ещё сравнения дробей и перейду к тестированию.

Добавлено через 4 часа 47 минут
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а тут мыслЯ такая возникла.
Ведь эти константы - они обычно небольшие, но их придётся вычислять в рантайме.
И мыслЯ заключается в том, что эти небольшие числа неплохо бы сделать constexpr.
создать константы для чисел не хочу, но вот можно ли создать несколько constexpr констант типа BigInt (для 0, 1, 2) и BigFrac (для 0/1 и 1/1) ? Такое возможно? Вот такое пригодилось бы.

Добавлено через 16 минут
Алексей1153, или просто создаются static const BigInt, BigFrac?
0
фрилансер
 Аватар для Алексей1153
6472 / 5691 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
10.06.2024, 14:39
Royal_X, всё можно, если захотеть ))

но std::string constexpr - только с C++20

поэтому придётся делать на основе, к примеру, std::array. А чтобы не повторять всё, что уже было сделано, BigInt для этого можно сделать шаблоном, а диапазоны передавать итераторами.
А для этого нужны внутренние методы, принимающие диапазоны

Хочется?
Решай сам.
Я бы заморочился, потому что задача так то прикольная

Добавлено через 3 минуты
ну и два алиаса будет
Например,
BigInt - это основной шаблон, параметризированный для работы с std::string ,
BigInt_const - для констант
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 14:40  [ТС]
Алексей1153, не, не хочу, т.к. это означает полностью всё переписать. Тогда сделаю static const.

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
к примеру, std::array.
я же поменял vector на string не для того, чтобы сейчас все менять на array...
0
фрилансер
 Аватар для Алексей1153
6472 / 5691 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
10.06.2024, 14:41
Royal_X, std::array будет только в константном варианте. В динамическом - вектор
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 14:43  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Тогда сделаю static const
я выбираю простые пути

Толку от такой оптимизации будет в разы меньше, нежели если бы я улучшил внутренние алгоритмы математических функций. Будет время, я могу реализовать более быстрые алгоритмы, а не заниматься микро-оптимизацией.
0
фрилансер
 Аватар для Алексей1153
6472 / 5691 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
10.06.2024, 14:47
ясно, что это можно будет потом. Но если в архитектуру не заложить эту возможность, то потом будет больно переделывать
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 15:06  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
ясно, что это можно будет потом. Но если в архитектуру не заложить эту возможность, то потом будет больно переделывать
я просто взвешиваю плюсы и минусы. И конкретно эта оптимизация это как вылизывание глушителя в надежде, что автомобиль поедет быстрее, тогда как лучше обратить внимание на двигатель.
0
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
10.06.2024, 17:46
Цитата Сообщение от Royal_X Посмотреть сообщение
std::string Abs(const std::string&);
И что, вернет число от "999999999999999999999999999999999999999 9999999999999999999999999999999999999999 999999" ?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 17:51  [ТС]
Цитата Сообщение от commun Посмотреть сообщение
И что, вернет число
3162277660168379331998893544432718533719 555

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 17:55  [ТС]
commun, ты спрашиваешь про ISqrt или Abs? Ты отредактировал пост?

Добавлено через 1 минуту
Цитата Сообщение от commun Посмотреть сообщение
std::string Abs(const std::string&);
у меня больше нет такой функции

Добавлено через 1 минуту
есть BigInt Abs(const BigInt&) и BigFrac Abs(const BigFrac&)
0
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
10.06.2024, 17:59
Я спрашиваю про Abs. Да не все равно?
Ввод один, возврат другой. Но тема отмечена "ОК". Я только сейчас сюда заехал.

Добавлено через 2 минуты
Может это ответ std::hex? Покажи dec.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 17:59  [ТС]
Цитата Сообщение от commun Посмотреть сообщение
Ввод один, возврат другой.
и что?
0
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
10.06.2024, 18:04
Хочу ввести произвольное число как строку и получить в итоге то же изображение (числа). Думал, вы все о том же кипите.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 18:05  [ТС]
Цитата Сообщение от commun Посмотреть сообщение
Хочу ввести произвольное число как строку
ну да, можно так
0
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
10.06.2024, 19:34
Цитата Сообщение от Royal_X Посмотреть сообщение
3162277660168379331998893544432718533719 555
Убедительно. Хотя квадрат ответа должен хотеть 3 последним знаком. А по числу разрядов - вроде как-будто ОК.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6249 / 2961 / 1048
Регистрация: 01.06.2021
Сообщений: 10,993
10.06.2024, 20:48  [ТС]
Цитата Сообщение от commun Посмотреть сообщение
Хотя квадрат ответа должен хотеть 3 последним знаком.
сверил с Maple, моя прога выдала правильно

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.06.2024, 20:48
Помогаю со студенческими работами здесь

Дан файл целых чисел. Подсчитать сумму чисел, больших числа N
program p1; var fx:text; s,k,n:real; c:integer; begin assign(fx,'C:\Users\Пользователь\Documents\аипас.txt'); reset (fx); ...

В массиве целых чисел подсчитать количество нечётных положительных чисел, больших 50
В массиве целых чисел подсчитать количество нечётных положительных чисел, больших 50. Вывести массив, сами числа и их количество. Если...

Найти сумму целых чисел положительных чисел, больших 20, меньших 100 и кратных 3
Найти сумму целых чисел положительных чисел, больших 20, меньших 100 и кратных 3.

Сравнить функции(рекурсивную и итерационную) по скорости выполнения для больших чисел
Вот мой код вычисления Факториала. а как посчитать время выполнения?Функции timeGetTime и GetTickCount и как их применить? ...

Для последовательности целых, оканчивающейся "8", определить число чисел, больших первого введенного числа
Помогите, пожалуйста, с заданием. Для последовательности целых чисел, оканчивающихся числом 8, определить количество чисел, больших...


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru