С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
86 / 86 / 30
Регистрация: 12.08.2014
Сообщений: 1,129

Работа с неограничено большими числами

08.01.2018, 23:47. Показов 1985. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Мне необходимо реализовать решение для такого задания:
я ввожу в консоли неограниченно большое число1 и число2 , больше long long int и выполняю над ними мат. операции. Хочу реализовать это с помощью doubly linked list и стэк на мат операции. Скажите, есть ли более оптимальный вариант?
Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2018, 23:47
Ответы с готовыми решениями:

Работа с большими числами
Подскажиье, пожалуйста, как работать с большими числами. Допустим у меня есть число...

Работа с большими числами (массивы)
Подскажите плз как мона выполнить умножение и деление чисел с большими значениями хранящихся я так думаю в массивах. пример:...

Задача простая, но надо её записать хорошо. Работа с большими числами
http://ipc.susu.ac.ru/210-2.html?problem=1500 - сама задача #include <iostream> #include <cmath> typedef long double dob; using...

8
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.01.2018, 00:02
Цитата Сообщение от paskalnikita Посмотреть сообщение
есть ли более оптимальный вариант
Длинная арифметика несложно реализуется на обычных массивах. Можешь использовать std::vector или std::deque.
Цитата Сообщение от paskalnikita Посмотреть сообщение
стэк на мат операции
Это как?
1
86 / 86 / 30
Регистрация: 12.08.2014
Сообщений: 1,129
09.01.2018, 00:04  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Это как?
начиная с конца : 123 + 789, после 3+9 будет 2 для 2+8 и тд
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.01.2018, 01:02
Цитата Сообщение от paskalnikita Посмотреть сообщение
будет 2 для 2+8
2+8+1

Но оптимальным вариантом было бы хранение числа в системе счисления с намного большим основанием, чем 10.
Например, я видел эффективную реализацию по основанию https://www.cyberforum.ru/cgi-bin/latex.cgi?2^{30}.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
09.01.2018, 11:24
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Например, я видел эффективную реализацию по основанию 230.
В принципе, это весьма грамотный подход. И если нужно реализовать только сложение - вообще идеальный. Но если нужно еще и умножение, лучше (легче) реализовать в системе счисление вдвое короче максимального целочисленного типа. Так, если мы имеем long в 32 разряда, то удобнее представлять числа по основанию 216
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.01.2018, 13:14
Цитата Сообщение от Байт Посмотреть сообщение
И если нужно реализовать только сложение - вообще идеальный
Для сложения было бы достаточно и 31 бита (При условии, что максимальный размер блока у нас 32 бита, оставшийся бит используется для обработки переноса). Про 30 я сказал неспроста, в интернете можно найти интересные платформо-зависимые алгоритмы.
Чтобы не быть голословным: умножение на базе SSE2 (pdf). В статье говорится конечно про 29 бит на блок, однако оно вроде как применимо и для основания https://www.cyberforum.ru/cgi-bin/latex.cgi?2^{30}.

Добавлено через 4 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Так, если мы имеем long в 32 разряда, то удобнее представлять числа по основанию 216
Сейчас вроде практически все процессоры поддерживают 64 битную арифметику, так что можно хранить данные в блоках по 32 бита, однако при выполнении операций преобразовывать их к большему типу, а потом результат дробить на части.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.01.2018, 15:30
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Но оптимальным вариантом было бы хранение числа в системе счисления с намного большим основанием, чем 10.
Для длинной арифметики оптимальный вариант - ассемблер. Не в курсе как там на 64-битовой платформе, но на 32-битовой x86 архитектуре прямо на уровне процессора поддерживался функционал "умножить 32 бита на 32 бита и получить 64 бита (в двух регистрах)". Плюсы же доступа к подобному не дают, а потому будут ассемблеру сливать.
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.01.2018, 16:01
Цитата Сообщение от Renji Посмотреть сообщение
Плюсы же доступа к подобному не дают, а потому будут ассемблеру сливать.
Просто весь этот функционал сильно зависит от платформы. Ну а так, есть интринсики.
1
86 / 86 / 30
Регистрация: 12.08.2014
Сообщений: 1,129
11.01.2018, 04:53  [ТС]
Хорошо, а может где-то есть пример реализоции того,что я хочу сделать?

Добавлено через 58 минут
Я нашел в интернете следующий код:
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
#include<iostream>
#include<string>
using namespace std;
 
int main(void)
{
    // the two "numbers" to be added. Make them as long as you like.
         string numStr1;
         string numStr2;
         cout << "Enter 1st number: "; cin >> numStr1;
         cout << "Enter 2nd number: "; cin >> numStr2;
 
    // keeping track of which string is longest using references
    string& rLongStr = numStr1.length() > numStr2.length() ? numStr1 : numStr2;
    string& rShortStr = numStr1.length() <= numStr2.length() ? numStr1 : numStr2;
 
    // initialize the sum with the long string but with space for a final carry at the beginning
    string numStrSum = '0' + rLongStr;// the '0' in case of a final carry
 
    // must go through the strings backwards since the least
    // significant digit is at the end, not the beginning.
    string::reverse_iterator r_itShort, r_itSum;
    r_itShort = rShortStr.rbegin();// point to last "digit" in the short string
    r_itSum = numStrSum.rbegin();// same for sum string
 
    // add the "digits" one by one from end to beginning of the short string
    while( r_itShort != rShortStr.rend() )
    {
        *r_itSum += *r_itShort - '0';// "add" the digits
        if( *r_itSum > '9' )// must carry a one to the next "digit"
        {
            *(r_itSum + 1) += 1;
            *r_itSum -= 10;
        }
        ++r_itShort;// move back 1 character
        ++r_itSum;// in each string
    }
    if( numStrSum.at(0) == '0' )// if 1st character is stiil '0'
        numStrSum.erase(0,1);// erase it
 
    // output result
    cout << numStrSum;
    cout << endl;
    return 0;
}
Скажите, можно ли на его основе сделать вычитание?
Я пробовал сделать что-то такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
while( r_itShort != rShortStr.rend() )
{
    *r_itSum -= *r_itShort + '0';
    if( *r_itSum > '9' )
    {
        *(r_itSum + 1) -= 1;
        *r_itSum += 10;
    }
    --r_itShort;
    --r_itSum;
}
if( numStrSum.at(0) == '0' )
    numStrSum.erase(0,1);
Но суть в том, что ничего не меняется, то есть мне также показывает сумму
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.01.2018, 04:53
Помогаю со студенческими работами здесь

Операции над большими числами
Здравствуйте. Хочу создать класс выполняющий арифметические операции над большие числа (знаю что велосипед, делаю в учебных целях). Класс...

Операции с большими дробными числами
Доброго времени суток! Мне нужно реализовать калькулятор больших(целых и дробных) чисел. Операции: + - * /. Может у кого-то есть...

Вычисление по формуле с большими числами
Необходимо реализовать код, вычисляющий значение по заданной формуле, который не занимал бы сутки для вычислений. m = cd mod n ...

Способы работы с очень большими числами
Здравствуйте, есть необходимость работать с числами выше 100000000000 но Visual Studio уже начинает выкабеливаться и выдавать данные...

Функция pow(x,y) не работает с большими числами?
Добрый день Подскажите пожалуйста как решить даную проблему: например pow(111111111, 2) -&gt; -2147483648 Не хотелось бы...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru