Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99

Длинная арифметика

13.05.2012, 13:32. Показов 3656. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте, пишу модуль длинной математики. В принципе, работоспособность у него положительная. Но в силу моей неопытности меня мучают вопросы оптимизации. М.б. кто то сможет (или уже смог) реализовать более красивый код, чем мой.Собственно сначала ввод/вывод.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*  Функция long_input не возвращает значения, а работает с сылочными параметрами.
    Эти параметры: ссылка на строку ввода и на vector<int>,
    в который и будет записано число любой размерности.
    В каждый элемент вектора записывается 4-значная цифра из строки.
    Предположим, в строку вы записали 103487365824375284.
    Тогда в векторе у вас будет следующее представление: 5284 | 2437 | 3658 | 3487 | 10
*/
 
void long_input(vector<int> &l_number, string &l_str){
    int len = 4;
        // len - скольки значное число хранится в каждом elem (4 - оптимально)
    for (int index = l_str.size() - 1; index >= 0; index -= len)
    {
        int start = index - len + 1;
        if (start < 0)
            start = 0;
        string elem = l_str.substr(start, index - start + 1);
            // Ф-ция substr извлекает подстроку длинной (index - start + 1)
            // из строки l_str начиная с позиции start
        l_number.push_back(atoi(elem.c_str()));
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*  Функция long_output_s не возвращает значения, а работает с сылочными параметрами.
    Эти параметры: ссылка на vector<int>, в котором записано число и строку вывода.
    Здесь преобразование обратное тому, что происходит при вводе.
*/
 
void long_output_s(string &l_str, vector<int> &l_number) {
    l_str = "";
    bool l_p = true;
    char buffer[4];
    vector<int>::iterator iter = l_number.end() - 1;
    sprintf(buffer, "%d", *iter);
    l_str += buffer;
    if (iter == l_number.begin())
        l_p = false;
    while (l_p){
        --iter;
        if (iter == l_number.begin())
            l_p = false;
        sprintf(buffer, "%.4d", *iter);
        l_str += buffer;
    }
 
}
Как допишу модуль, и вытащу (с вашей помошью, если можно) из него все костыли, обязательно поделюсь))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.05.2012, 13:32
Ответы с готовыми решениями:

Длинная арифметика
http://www.acmp.ru/index.asp?main=task&amp;id_task=103 Как решить эту задачу? С помощью чего, и в чем смысл решения длянной...

Длинная арифметика
Как сделать типы длинных чисел, например, знаковое 256-ти битное целое и 256-ти битное вещественное с 224-х битной мантиссой и 32-х битным...

Длинная арифметика
нужен текст програмы на С, в которой был бы реализован алгоритм ввода-вывода длинного числа, разности двух длинных чисел и их сравнение.

14
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 13:35
Цитата Сообщение от G@leON Посмотреть сообщение
// len - скольки значное число хранится в каждом elem (4 - оптимально)
Оптимально - 9.
По идее, можно и больше...
1
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99
13.05.2012, 13:41  [ТС]
Цитата Сообщение от diagon Посмотреть сообщение
Оптимально - 9.
По идее, можно и больше...
Ага, читал, но везде писали по разному, кто 9, кто 4. В книжке Окулова "Программирование в алгоритмах" говорится, что оптимально 4. ))
0
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
13.05.2012, 13:42
Цитата Сообщение от G@leON Посмотреть сообщение
Ага, читал, но везде писали по разному, кто 9, кто 4. В книжке Акулова "Программирование в алгоритмах" говорится, что оптимально 4.
Окулова
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 13:45
Цитата Сообщение от G@leON Посмотреть сообщение
Ага, читал, но везде писали по разному, кто 9, кто 4. В книжке Акулова "Программирование в алгоритмах" говорится, что оптимально 4.
Оптимально 9, ибо чем больше цифр хранится в одном элементе. тем меньше этих самых элементов в векторе, и, соответственно, быстрее производятся операции и требуется меньше памяти.
0
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99
13.05.2012, 13:59  [ТС]
Так, такой вопрос, смотрел насколько ресурсов, 1 из них мне очень даже понравился.
C++
1
2
Для глубокого понимания всего, что тут происходит, предлагаю вам ознакомиться с ресурсом:
    [url]http://cppalgo.blogspot.com/2010/05/blog-post.html[/url]
У меня возник вопрос, что лучше, сделать свою структуру, или м.б. даже класс. Или же решать функциональным подходом. Ответ, вроде может показаться очевидным - делай класс. Но конкретная реализация на ресурсе использовала массивы, что мне кажется несколько менее красивым, чем использование вектора. Я же заменил всю структуру вектором. То м.б. удобно будет сделать класс (структуру), который будет состоять из вектора.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:04
Реализаций много, одна из лучших для с++ - библиотека gmp, в которой можно использовать код на чистом C, либо обертку вокруг него в виде класса.
А в класс стоит оборачивать, чтобы можно было писать подобные конструкции.
C++
1
2
BigInteger a = 3;
std::cout << a * 2; //выведет 6
Это намного удобнее для пользователя, чем функции.
Вот еще один неплохой ресурс с длинной арифметикой на с++ - http://e-maxx.ru/algo/big_integer
2
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
13.05.2012, 14:19
Цитата Сообщение от diagon Посмотреть сообщение
Реализаций много, одна из лучших для с++ - библиотека gmp, в которой можно использовать код на чистом C, либо обертку вокруг него в виде класса.
А в класс стоит оборачивать, чтобы можно было писать подобные конструкции.
C++
1
2
BigInteger a = 3;
std::cout << a * 2; //выведет 6
Это намного удобнее для пользователя, чем функции.
Вот еще один неплохой ресурс с длинной арифметикой на с++ - http://e-maxx.ru/algo/big_integer
Не всегда внешние ресурсы спасают, например, мне разрешено использовать на тестирующей машине только стандартные либы, и не более. Приходится всё самому писать
0
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99
13.05.2012, 14:34  [ТС]
Может оно тогда к лучшему и не заморачиваться по поводу написания модуля арифметики, если уж gmp есть? Очень удобная библиотека для пользования. В info все от и до описано.

Как же я так пропустил ее мимо

Добавлено через 1 минуту
Цитата Сообщение от Ternsip Посмотреть сообщение
Не всегда внешние ресурсы спасают, например, мне разрешено использовать на тестирующей машине только стандартные либы, и не более. Приходится всё самому писать
Ну это смотря для каких целей.

Я тогда на время от этой темы уйду, вернусь недельки через 2-3 к ней. Все таки самому изобрести велосипед по новой тоже бывает полезно. А там и собственно класс выложу, для работы с длинными, что бы пользователя порадовать, особенно тех, кому использовать сторонние либы нельзя.
Всем спасибо...
1
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99
12.06.2012, 16:23  [ТС]
И так, возвращаясь к теме длинной арифметики, коей я интересовался некоторое время назад.
GMP - библиотека действительно очень удобная, хотя и много было вопросов по поводу того как ее подключить, все ответы уже есть, тем более они на русском...
Что касаемо сообщений на тему, мне нельзя использовать сторонние либы или нужно свой класс реализовать или я не силен, а сторонние либы какие то громоздкие больно (именно с такой проблемой я по началу сам столкнулся): вот здесь http://cppalgo.blogspot.com/2010/05/blog-post.html все по полочкам разложено о написании собственного класса с пояснениями, как и что. Автор использует struct, но кто вам мешает использовать class и вынести это в заголовочный файл. Там даже код есть, немного переделываем, если есть желание, и все готово.
Свою реализацию класса выложу после экзамена 18 июня с пояснениями. Еще раз спасибо тем, кто помог мне, и показал полезные ссылки...
1
 Аватар для G@leON
6 / 6 / 2
Регистрация: 02.06.2009
Сообщений: 99
16.06.2012, 21:49  [ТС]
Класс длинно-численной арифметики выставляю чуть раньше обещанного. Прошу сильно не ругать, если где то увидели корявую реализацию. Советы по оптимизации принимаются (как в части математической, так и в части реализации самого кода) - буду очень признателен. Все советы по исправлению и доработке буду обязательно использовать, что однозначно улучшит данный вариант.
Я описал только названия - что для чего. В принципе, очень похожий код вы найдете по ссылке из предыдущего сообщения + полное описание математики произходящего.
Вложения
Тип файла: rar big_int.rar (3.6 Кб, 40 просмотров)
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
16.06.2012, 21:56
C++
1
2
3
4
5
6
7
8
using std::istream;
using std::ostream;
using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::max;
using namespace std;
смысл?

C++
1
#define MAX_LEN 500 // в зависимости от задачи
лучше сделать как параметр шаблона

класс, функции друзья лучше завернуть в пространство, и заоодно все служебные константы
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.06.2012, 00:10
А почему собственно вектор? Разве дек не оптимальнее?

Насчет gmp - там нет логарифмов,экспонент итп поэтому придется реализовывать самому через ряды (с использованием gmp конечно) - думаю это можно было бы написать + обвертку класса по то му как при работе через ф-ции код получается не такой читаемый
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.06.2012, 09:01
Цитата Сообщение от Avazart Посмотреть сообщение
Разве дек не оптимальнее?
Мне кажется, что вектор будет получше.
С одной стороны, будут переезды из одного куска памяти в другой, с другой стороны - во всем остальном вектор быстрее, так как удалять элементы нужно только с конца.

В коде мне не нравится ограничение на максимальную длину чисел. Если использовать вектор, то таких ограничений не будет, можно и без вектора неограниченную длину сделать.
И еще нужно обернуть класс в отдельное пространство имен, и уже в этом пространстве написать все необходимые using'и. А то сейчас получается такая ситуация, что при включении вашего хедера автоматически раскрывается пространство имен std, а это не есть гуд.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.06.2012, 16:09
Мне кажется, что вектор будет получше.
так как удалять элементы нужно только с конца.
Ну да, но это если расматривать только большие целые, а если большие с плавующей точкой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2012, 16:09
Помогаю со студенческими работами здесь

Длинная арифметика
Вот условие задачи: Во время исследований, посвященных появлению жизни на планете Олимпия, учеными было сделано несколько сенсационных...

Длинная арифметика
Ребята,объясните как решить задачу , напишите хоть часть кода. Пусть даны числа a , b . Найти a+b, если a и b не больше чем 10 в...

Длинная арифметика
Алгоритмы всех операций в принципе уже готовы (длина числа ограничивается только ресурсами ПК). Осталось только подобрать качественный...

длинная арифметика
Долгое время бьюсь как составить программу по этой теме в интернете искал нашел это for (int i=(int)s.length(); i&gt;0; i-=9) if (i...

Длинная арифметика
Программка уже почти готова, единственное неправильно находит остаток при делении По заданию: Надо ввести 2-ва целых числа неогран....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru