Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемножить два больших числа 
:(
    Опции темы
Хоббит
Дата 15.10.2011, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



Например необходимо перемножить 2 больших числа (больше чем long) заданы они аргументами программы, в виде строк (char *).

Придумал такой вариант

Перевести строки в массив (short *) в каждой ячейке своё число.
Взять результирующий массив int discharges[len1 + len2 + 1] длинной как сумма длин аргументов

И умножить как столбиком, только в старший разряд сразу не переносить, а только при выводе результата

Код

        // Перемножаем столбиком
        for (i = 0; i < len2; ++i)                                                                                                                           
                for (j = 0; j < len1; ++j)                                                                                                                   
                        discharges[i + j] += arg1[j] * arg2[i];                                                                                              
                                                    
        // Формируем результат                                                                                                         
        char *buffer = (char*)malloc((len1 + len2) * sizeof(char));                                                                                          
                                                                                                                                                             
        for (i = 0; i < len1 + len2; ++i)                                                                                                                
        {                                     
                // Учитываем что 0 это младший разряд                                                                                                               
                buffer[len1 + len2 - i - 1] = '0' + discharges[i] % 10;                                                                                      
                // Выполняем перенос
                discharges[i + 1] += discharges[i] / 10;                                                                                                     
        }                                                                                                                                                                                                                                                                                                                


Подскажите может есть более красивые методы?
PM MAIL   Вверх
borisbn
Дата 15.10.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



По-моему, очень даже ничего. Только нужно придумать, как избавиться от '0' в начале  smile 
http://liveworkspace.org/code/253091e57c8f...117f6931eaaead3


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 15.10.2011, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Почему в исходых массивах не вычитаешь '0'. а в результате добавляешь? Не логично.
Если в массивах хранятся символы '0'...'9', логичнее хранить начиная со старшего + возможный '-' в начале, и '\0' в конце, чтобы сразу можно было распечатать.
Для убыстрения можно на входе иметь массив unsigned short, discharges будет unsigned long, но при этом придётся делать спецальную процедуру для распечатки результата. 
Альтернативный вариант вычислению столбиком - быстрое умножение
PM   Вверх
borisbn
Дата 15.10.2011, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(math64 @  15.10.2011,  10:54 Найти цитируемый пост)
Почему в исходых массивах не вычитаешь '0'. а в результате добавляешь?

Цитата(Хоббит @  15.10.2011,  09:44 Найти цитируемый пост)
Перевести строки в массив (short *) в каждой ячейке своё число.


Цитата(math64 @  15.10.2011,  10:54 Найти цитируемый пост)
Альтернативный вариант вычислению столбиком - быстрое умножение

дал бы ссылочку  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 15.10.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Хоббит, вот вариант без '0' в начале и с учётом знака
http://liveworkspace.org/code/92c4acb81940...4492e0f7a883015
плюс немного соптимизировано - на 0 не умножается smile

Это сообщение отредактировал(а) borisbn - 15.10.2011, 14:21


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 15.10.2011, 15:25 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



PM   Вверх
Хоббит
Дата 15.10.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



Всем спасибо большое. В принципе '0' я учел в начале, просто я упростил код в топике. Примеры сейчас смотрю.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.