|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - программа перемножения длинных чисел на С++ |
|
C/C++ - программа перемножения длинных чисел на С++
|
Новый участник Сообщения: 2 |
Профиль | Отправить PM | Цитировать Помогите написать программу реализующую алгоритмы (умножение «столбиком», метод Карацубы, БПФ) перемножения длинных чисел в зависимости от параметров исходных данных (чисел) на С++
Если можно, с пояснениями |
|
Отправлено: 18:28, 02-05-2011 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать Lyanni, как обычно, с вас черновики решения, с нас поправки и наводящие вопросы.
БПФ - быстрое преобразование Фурье? С Википедией сверялись? умножение столбиком - это как должно выглядеть? |
------- Отправлено: 21:54, 02-05-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Алгоритмумножения «в столбик» длинных чисел С = А*В длины n цифр
1) C := 0; (достаточно обнулить n младших цифр) 2) для i = 0 … n-1 выполнить шаги 3-8; 3) d :=0; 4) для j = 0 … n-1 выполнить шаги 3-5; 5) T :=Ci+j + Ai*Bi +d; 6) Ci+j : = LODIGIT(T); 7) d := HIDIGIT(T); 8) Ci+n := d; 9) конец. БПф - быстрое преобразование фурье Тогда функция для перемножения двух многочленов будет выглядеть следующим образом: void multiply (const vector<int> & a, const vector<int> & b, vector<int> & res) { vector<base> fa (a.begin(), a.end()), fb (b.begin(), b.end()); size_t n = 1; while (n < max (a.size(), b.size())) n <<= 1; n <<= 1; fa.resize (n), fb.resize (n); fft (fa, false), fft (fb, false); for (size_t i=0; i<n; ++i) fa[i] *= fb[i]; fft (fa, true); res.resize (n); for (size_t i=0; i<n; ++i) res[i] = int (fa[i].real() + 0.5); функция для перемножения двух длинных чисел практически ничем не отличается от функции для перемножения многочленов. Единственная особенность — что после выполнения умножения чисел как многочлены их следует нормализовать, т.е. выполнить все переносы разрядов: int carry = 0; for (size_t i=0; i<n; ++i) { res[i] += carry; carry = res[i] / 10; res[i] %= 10; Без понятия как это сбить в одну прогу, сама учусь на мат. факе (будущий учитель математики), дали курсовую по такой теме на С++, С++ не проходила... |
Отправлено: 00:06, 03-05-2011 | #3 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 10:48, 03-05-2011 | #4 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Материнская плата 4 длинных сигнала | Alek Sk | Материнские платы и память | 7 | 15-11-2020 10:57 | |
[решено] мать gigabyte ga-g31m Семь длинных сигналов | last-77 | Материнские платы и память | 11 | 20-09-2010 10:54 | |
При включении короткий гудок, потом один или два длинных(по разному) и отрубается | qwerty1999 | Непонятные проблемы с Железом | 2 | 28-07-2009 09:54 | |
C/C++ - Последовательность чисел | denver-312 | Программирование и базы данных | 7 | 02-01-2008 20:54 | |
Потеря длинных пакетов в локальной сети | Rever | Сетевые технологии | 16 | 26-06-2003 17:18 |
|