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

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

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

Добавлено через 49 секунд
можно сразу набор флажков делать
знак
бесконечность
NAN
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6704 / 3125 / 1065
Регистрация: 01.06.2021
Сообщений: 12,101
07.06.2024, 11:16  [ТС]
Алексей1153, т.е. потом каждая функция должна проверять флаг nan?
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
07.06.2024, 11:21
Royal_X, а сейчас это не делается? А как ты сейчас обозначаешь эти состояния?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6704 / 3125 / 1065
Регистрация: 01.06.2021
Сообщений: 12,101
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6704 / 3125 / 1065
Регистрация: 01.06.2021
Сообщений: 12,101
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
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6704 / 3125 / 1065
Регистрация: 01.06.2021
Сообщений: 12,101
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
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
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
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
07.06.2024, 14:23
Цитата Сообщение от Evgen173 Посмотреть сообщение
или так
а так мне не нравится
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6704 / 3125 / 1065
Регистрация: 01.06.2021
Сообщений: 12,101
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
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
07.06.2024, 15:39
Цитата Сообщение от Royal_X Посмотреть сообщение
не хочу строке дефолтно что-нибудь присваивать
так это всё равно произойдёт в конструкторе
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6704 / 3125 / 1065
Регистрация: 01.06.2021
Сообщений: 12,101
07.06.2024, 16:02  [ТС]
У меня несколько вопросов:

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

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

3) как скрыть некоторые функции от юзера (т.е. те, что для внутренних проверок). Разумеется они будут private, но все равно они видны. Правильно я понимаю, что в таких случаях просто имя функции дают с нижнего подчеркивания?
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
07.06.2024, 16:08
1 - не очень понятно, покажи пример
2 - вызывать функцию никак не запретишь
3 - приватные не могут быть доступны. Покажи пример, про что речь
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6704 / 3125 / 1065
Регистрация: 01.06.2021
Сообщений: 12,101
07.06.2024, 16:11  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
1 - не очень понятно, покажи пример
нужно, чтобы мог пользоваться функцией так:
BigInt::Add(a, b);
Цитата Сообщение от Алексей1153 Посмотреть сообщение
вызывать функцию никак не запретишь
Но что это за бред a.Add(b, c)???
нужно запретить, чтобы объекты класса не вызывали функцию
Цитата Сообщение от Алексей1153 Посмотреть сообщение
приватные не могут быть доступны. Покажи пример, про что речь
я имею в виду в IDE при вводе кода. Ставишь точку после имени объекта класса и появляется список функций, среди которых и приватные
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6704 / 3125 / 1065
Регистрация: 01.06.2021
Сообщений: 12,101
07.06.2024, 16:19  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это статическая функция
да, я знаю, но как объявляю как static, то не работает
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
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
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru