#c
#c
Вопрос:
В настоящее время я пытаюсь найти метод умножения двух чисел, хранящихся в векторе. У меня есть функция сложения для произвольно больших чисел. Есть ли лучший метод, чем просто выполнять умножение столбцов между каждой цифрой и складывать их вместе в сумму? Псевдокод для того, что у меня есть ниже.
vector<int> total;
int carry = 0; //int to store carrying value if needed
//initialize v1 and v2
for each element i of v1:
vector<int> temp;
for each element j of v2:
get v1[i] * v2[j] and compute how much carrying is needed
push adjusted product to temp
push carry to temp and reset carry
add(temp, total)
Комментарии:
1. Ваш псевдокод настолько похож на C , что с таким же успехом вы могли только что написать C . Похоже, вы пытаетесь реализовать длительное умножение. Наиболее значительное ускорение, которое вы могли бы сделать прямо сейчас, — это использовать что-то вроде
std::vector<uint64_t>
, чтобы ваши «цифры» были 64-разрядными значениями вместо предположительно базового 10. Тогда вам просто нужно реализовать двоичное преобразование в десятичное, если вы хотите это вывести. Представьте, как быстро можно умножать целые числа на тысячи битов, когда вы можете выполнять фрагменты по 64 бита за раз. Ваш цикл O (N ^ 2) будет в 400 раз быстрее, если уменьшить 20 цифр до 1 значения.2. Ознакомьтесь с алгоритмом Карацубы , он может уменьшить количество умножений, которые вам нужно выполнить. Объединение его с предложением @ paddy о переходе на 64-разрядную версию должно иметь значение, если ваши числа большие.
3. да, Карацуба, и просто вся статья Википедии обо всех из них была бы полезна для чтения OP. В принципе, существуют более эффективные алгоритмы умножения, чем тот, который вы изучаете в начальной школе: en.wikipedia.org/wiki/Multiplication_algorithm