Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2011, 12:55   #1
Lyanni
 
Регистрация: 04.04.2011
Сообщений: 4
Печаль Программа перемножения длинных чисел в C++

Помогите написать программу реализующую различные алгоритмы перемножения(умножение «столбиком», метод Карацубы, БПФ и др.) в зависимости от параметров исходных данных (чисел)
Если можно, с пояснениями =)

Последний раз редактировалось Lyanni; 04.04.2011 в 13:31.
Lyanni вне форума Ответить с цитированием
Старый 04.04.2011, 16:14   #2
Dissident
Пользователь
 
Регистрация: 03.04.2011
Сообщений: 11
По умолчанию

Дайте формулы по которым должна быть реализована программа, или вас устроит обычная программа калькулятор?
Dissident вне форума Ответить с цитированием
Старый 27.04.2011, 00:40   #3
Lyanni
 
Регистрация: 04.04.2011
Сообщений: 4
По умолчанию

Алгоритмумножения «в столбик» длинных чисел С = А*В длины 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) конец.
Алгоритм карацубы заключается в разбиении исходных чисел A и B на две части.
При этом получим
A=A_1*b^k+A_0,B=B_1*b^k+B_0,
где k=max(m,n)/2, m - число цифр по основанию b в числе A, а n - число цифр по основанию b в числе B.
Теперь произведение C=A*B можно вычислить с помощью лишь трех умножений целых чисел длиной k или меньше плюс несколько сдвигов и сложений, используя формулу
C=A*B=(A_1*B_1 )*b^(2*k)+(A_1*B_0+A_0*B_1 )*b^k+(A_0*B_0),
где A_1*B_0+A_0*B_1=(A_1+A_0 )*(B_1*B_0 )-A_1*B_1-A_0*B_0.
Lyanni вне форума Ответить с цитированием
Старый 27.04.2011, 00:43   #4
Lyanni
 
Регистрация: 04.04.2011
Сообщений: 4
По умолчанию

Алгоритм БПФ для перемножения двух многочленов будет выглядеть следующим образом:
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;
}
Lyanni вне форума Ответить с цитированием
Старый 27.04.2011, 00:44   #5
Lyanni
 
Регистрация: 04.04.2011
Сообщений: 4
По умолчанию

Я без понятия как это скомпоновать....(
Lyanni вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложение длинных чисел C++ LaDark Общие вопросы C/C++ 0 15.11.2010 18:56
Ввод длинных чисел yukl Помощь студентам 1 18.05.2010 16:15
Умножение длинных чисел в Pascal SeRhy Помощь студентам 2 04.12.2008 23:50
Умножение длинных чисел SeRhy Помощь студентам 1 28.11.2008 20:04
Умножение длинных целых чисел Rifler Паскаль, Turbo Pascal, PascalABC.NET 1 04.06.2008 21:12