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

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

06.06.2024, 22:40. Показов 11530. Ответов 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
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 10:58
Студворк — интернет-сервис помощи студентам
Royal_X, да, это разумно

Добавлено через 49 секунд
можно сразу набор флажков делать
знак
бесконечность
NAN
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
07.06.2024, 11:16  [ТС]
Алексей1153, т.е. потом каждая функция должна проверять флаг nan?
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 11:21
Royal_X, а сейчас это не делается? А как ты сейчас обозначаешь эти состояния?
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
07.06.2024, 11:29  [ТС]
Алексей1153, хорошо, попробую создать класс
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
07.06.2024, 11:52
Цитата Сообщение от Royal_X Посмотреть сообщение
Кроме того, какая разница, функция проверяет входные данные или класс?
Класс это сделает один раз:

C++
1
2
3
4
5
6
7
BigInt a("123213");//вылетает исключение, если строка ошибочная (+1 проверка)
BigInt b("76876");//вылетает исключение, если строка ошибочная (+1 проверка)
BigInt c = Add(a, b);//a и b гарантированно содержат числа, проверки не требуются
BigInt d = Divide(a, b);//a и b гарантированно содержат числа, проверки не требуются
BigInt e = Power(a, b);//a и b гарантированно содержат числа, проверки не требуются
BigInt f = Add(c, Add(d, e));//c, d, e - гарантированно содержат числа, проверки не требуются
//итого: 2 проверки входных данных
Без класса:

C++
1
2
3
4
5
6
7
std::string a("123213");//нет проверок
std::string b("76876");//нет проверок
std::string c = Add(a, b);//a и b могут быть любыми строками, нужна валидация (+2 проверки)
std::string d = Divide(a, b);//a и b могут быть любыми строками, нужна валидация (+2 проверки)
std::string e = Power(a, b);//a и b могут быть любыми строками, нужна валидация (+2 проверки)
std::string f = Add(c, Add(d, e));//c, d, e - могут быть любыми строками, нужна валидация (+4 проверки)
//итого: 10 проверок входных данных
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
07.06.2024, 12:44  [ТС]
Алексей1153, я собираюсь реализовать такие поля:
C++
1
2
3
std::string value; // будет хранить цифры
bool nan; // для определения корректности числа
bool neg; // для знака, чтобы определить, число отрицательное или неотрицательное (0 или положительное)
в вашем примере поля являются protected. Может мне выбрать private, чтобы пользователь не менял что-либо вручную?

Добавлено через 2 минуты
Алексей1153, и может сразу дать полям дефолтные значения?

C++
1
2
3
std::string value;
bool nan = true;
bool neg = false;
Добавлено через 15 минут
Посоветуйте, какие конструкторы, деструкторы и как правильно мне создать. Я в ООП ноль.

хочу следующие возможности:

1)

C++
1
BigInt a; // "0"
2)

C++
1
BigInt a(); // "0"
3)

C++
1
BigInt a{}; // "0"
4)

C++
1
BigInt a = "-45";
5)

C++
1
BigInt a("-45");
6)

C++
1
BigInt a{"-45");
7)

C++
1
BigInt b(a);
8)

C++
1
BigInt b{a};
9)

C++
1
BigInt b = a;
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 12:48
Цитата Сообщение от Royal_X Посмотреть сообщение
protected
у меня private

флаги я бы сделал в виде набора битов - битовыми полями

изначально пусть будет обычный 0. Можно, конечно, было бы ещё флаг null добавить, но, мне кажется, это не имеет смысла

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyBigNum
{
    std::string value={1,'\0'}; //или '0' ? Не знаю, что у тебя там принято за значения разрядов
    
    struct s_flags
    {
        using T=unsigned char;
        
        T sign:1;//0 + ; 1 -
        T nan:1;//не число
        T inf:1;//бесконечность
        private:
        T reserv:5;
    }flags{};
    static_assert(sizeof(s_flags)==sizeof(s_flags::T));
    
public:
...
...
};
Добавлено через 4 минуты
Цитата Сообщение от Royal_X Посмотреть сообщение
какие конструкторы
для начала два достаточно - по умолчанию и из std::string_view

Цитата Сообщение от Royal_X Посмотреть сообщение
деструкторы
тут выбор небольшой
На самом деле, тут компилятор сам его сделает
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
07.06.2024, 12:50
Цитата Сообщение от Royal_X Посмотреть сообщение
BigInt a(); // "0"
Это объявление функции, но не переменной a.
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
07.06.2024, 13:50  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Это объявление функции, но не переменной
т.е. так объект класса создать нельзя?

Добавлено через 4 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
флаги я бы сделал в виде набора битов - битовыми полями
для начала я обойдусь без этого и только двумя флагами, без бесконечности, т.к. я не работаю с комплексными числами и при делении на 0 число получит флаг nan.

Добавлено через 54 минуты
Алексей1153, создал такие конструкторы (пока без проверки на валидность строки). Я их пронумеровал и те же номера выставил в main.

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
class BigInt
{
    std::string value;
    bool nan = true;
    bool sign = false;
public:
    // #1 default constructor
    BigInt()
    {
        nan = false;
        value = "0";
    }
 
    // #2 default constructor with parameter
    BigInt(const std::string& s)
    {
        value = s;
        nan = false;
    }
 
    // #3 copy constructor
    BigInt(const BigInt& x)
    {
        value = x.value;
        sign = x.sign;
        nan = x.nan;
    }
 
    // #4 copy assignment operator
    BigInt& operator=(const BigInt&)
    {
        return *this;
    }
};
 
int main()
{
    std::string x = "23";
 
    // #1
    BigInt a;
    BigInt b{};
 
    // #2
    BigInt c("10");
    BigInt d{"42"};
    BigInt e(x);
    BigInt f{x};
    BigInt g = x;
 
    // #3
    BigInt h(c);
    BigInt i{d};
    BigInt j = c;
 
    // #4
    a = h;
 
}
Учитывая, что я реализовал конструктор копирования и оператор присваивания копированием, то я подпадаю под эти злосчастные правила трех, пяти, ноля...

Не подскажете, что мне еще нужно добавить, чтобы не нарушать ничего?

И еще, я хотел бы добавить еще такие варианты:
C++
1
2
BigInt a = "13";
a = "24";
Что мне для этого нужно сделать? Типа добавить конструктор для const char*? Как это делать?
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 14:19
Royal_X, я бы так сделал

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
#include <string>
 
class BigInt
{
    std::string value{1,'0'};
    bool nan{};
    bool sign{};
public:
    BigInt()=default;
 
    BigInt(const std::string_view s):value{s}
    {
    }
};
 
int main()
{
    std::string x = "23";
 
    // #1
    BigInt a;
    BigInt b{};
 
    // #2
    BigInt c("10");
    BigInt d{"42"};
    BigInt e(x);
    BigInt f{x};
    BigInt g = BigInt{x};
 
    // #3
    BigInt h(c);
    BigInt i{d};
    BigInt j = c;
 
    // #4
    a = h;
    
    {
        BigInt a = BigInt{"13"};
        a = BigInt{"24"};    
    }
}
1
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
07.06.2024, 14:20
Royal_X, или так
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
#include <iostream>
#include <cstring>
 
class BigInt
{
    std::string value;
    bool nan = true;
    bool sign = false;
public:
    // #1 default constructor
    BigInt()
    {
        nan = false;
        value = "0";
    }
 
    // #2 default constructor with parameter
    BigInt(const std::string& s)
    {
        value = s;
        nan = false;
    }
 
    // #3 copy constructor
    BigInt(const BigInt& x)
    {
        value = x.value;
        sign = x.sign;
        nan = x.nan;
    }
 
    // #4 copy assignment operator
    BigInt& operator=(const BigInt&)
    {
        return *this;
    }
    
    // #5 copy assignment operator
    BigInt& operator=(const char* s)
    {
        value = std::string(s);
        nan = false;
        return *this;
    }
    
    // #6 default constructor with parameter
    BigInt(const char* s)
    {
        value = std::string(s);
        nan = false;
    }
    
    // test
    void print(void)
    {
        std::cout << value << std::endl;
    }
};
 
int main()
{
    BigInt z="13"; // #6
    z.print();
    z = "24"; // #5
    z.print();
    
    return 0;
}
1
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 14:23
Цитата Сообщение от Evgen173 Посмотреть сообщение
или так
а так мне не нравится
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
07.06.2024, 14:46  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
BigInt a = BigInt{"13"};
        a = BigInt{"24"};
то что так можно, я знаю. Но зачем мучить юзера, если еще можно реализовать

C++
1
2
BigInt a = "13";
a = "24";
Добавлено через 2 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
BigInt()=default;
BigInt(const std::string_view s):value{s}
    {
    }
выглядит красиво, но когда придется внедрять проверки, это затруднит

еще этот string_view. я понимаю, что он круче, чем const string&, но повышать до С++17 я не хочу

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
std::string value{1,'0'};
не хочу строке дефолтно что-нибудь присваивать, лишняя операция присваивания. Если юзер ввел число, то пусть сразу присвоится это число, если ввел мусор, то ничего не присваивается строке, выставляется просто nan

Добавлено через 17 минут
Цитата Сообщение от Evgen173 Посмотреть сообщение
C++
1
2
3
4
5
6
// #6 default constructor with parameter
    BigInt(const char* s)
    {
        value = std::string(s);
        nan = false;
    }
кстати, если добавить это, то выражения
C++
1
2
BigInt c("10");
BigInt d{"42"};
которые у меня были под номером 2 (конструктор с параметром типа string) теперь будут обрабатываться вот этим новым конструктором. Думаю, ничего страшного в этом нет. Ведь, я так понимаю, такое же конвертирование const char* -> string происходило и тогда, автоматически. Просто нужно подправить номера))
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 15:39
Цитата Сообщение от Royal_X Посмотреть сообщение
не хочу строке дефолтно что-нибудь присваивать
так это всё равно произойдёт в конструкторе
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
07.06.2024, 16:02  [ТС]
У меня несколько вопросов:

1) как создать функцию класса, которая будет работать без создания объекта класса, например, чтобы вызвать потом BigInt::Add(). Пробовал static, но он не работает, когда я в классе только объявляю функцию, а определяю вне класса (мне просто удобно писать весь код функции вне класса).

2) как создать функцию класса, которая будет работать только без создания объекта класса, т.е. чтобы объект класса не смог вызвать эту функцию. Потому что будет бредово выглядеть a.Add(b, c). Я хочу только BigInt::Add(a, b), а потом еще оператор перазагружу a + b

3) как скрыть некоторые функции от юзера (т.е. те, что для внутренних проверок). Разумеется они будут private, но все равно они видны. Правильно я понимаю, что в таких случаях просто имя функции дают с нижнего подчеркивания?
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 16:08
1 - не очень понятно, покажи пример
2 - вызывать функцию никак не запретишь
3 - приватные не могут быть доступны. Покажи пример, про что речь
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
07.06.2024, 16:11  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
1 - не очень понятно, покажи пример
нужно, чтобы мог пользоваться функцией так:
BigInt::Add(a, b);
Цитата Сообщение от Алексей1153 Посмотреть сообщение
вызывать функцию никак не запретишь
Но что это за бред a.Add(b, c)???
нужно запретить, чтобы объекты класса не вызывали функцию
Цитата Сообщение от Алексей1153 Посмотреть сообщение
приватные не могут быть доступны. Покажи пример, про что речь
я имею в виду в IDE при вводе кода. Ставишь точку после имени объекта класса и появляется список функций, среди которых и приватные
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 16:17
Цитата Сообщение от Royal_X Посмотреть сообщение
нужно, чтобы мог пользоваться функцией так:
BigInt::Add(a, b);
это статическая функция


Цитата Сообщение от Royal_X Посмотреть сообщение
a.Add(b, c)
Цитата Сообщение от Royal_X Посмотреть сообщение
BigInt::Add(a, b)
для вызова статической функции это одинаковые записи. Объект не обязателен

я бы сделал
C++
1
friend BigInt operator+(const BigInt&, const BigInt&);


Цитата Сообщение от Royal_X Посмотреть сообщение
я имею в виду в IDE при вводе кода.
это зависит от IDE. К языку отношения не имеет
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
07.06.2024, 16:19  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это статическая функция
да, я знаю, но как объявляю как static, то не работает
0
фрилансер
 Аватар для Алексей1153
6508 / 5758 / 1135
Регистрация: 11.10.2019
Сообщений: 15,406
07.06.2024, 16:20
Royal_X, я и говорю - покажи пример
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2024, 16:20

Дан файл целых чисел. Подсчитать сумму чисел, больших числа 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, определить количество чисел, больших...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru