У меня реализован алгоритм умножения karatsuba. Я хочу улучшить его таким образом, чтобы я мог умножить 2 64-значных числа, но я не знаю, как это сделать. Мне дали намек на то, что оба числа содержат число цифр, которое является силой двух, но это ничего мне не дает. Не могли бы вы дать какие-либо другие подсказки? Любой намек на математическую подсказку или алгоритм.Умножение 2 64-значных чисел в C++
#include <iostream>
#include <math.h>
using namespace std;
int getLength(long long value);
long long multiply(long long x, long long y);
int getLength(long long value)
{
int counter = 0;
while (value != 0)
{
counter++;
value /= 10;
}
return counter;
}
long long multiply(long long x, long long y)
{
int xLength = getLength(x);
int yLength = getLength(y);
// the bigger of the two lengths
int N = (int)(fmax(xLength, yLength));
// if the max length is small it's faster to just flat out multiply the two nums
if (N < 10)
return x * y;
//max length divided and rounded up
N = (N/2) + (N % 2);
long long multiplier = pow(10, N);
long long b = x/multiplier;
long long a = x - (b * multiplier);
long long d = y/multiplier;
long long c = y - (d * N);
long long z0 = multiply(a, c);
long long z1 = multiply(a + b, c + d);
long long z2 = multiply(b, d);
return z0 + ((z1 - z0 - z2) * multiplier) + (z2 * (long long)(pow(10, 2 * N)));
}
int main()
{
long long a;
long long b;
cin >> a;
cout << '\n';
cin >> b;
cout << '\n' << multiply(a, b) << endl;
return 0;
}
Вот еще Подсказка: использование 'pow()' [даст неправильные ответы] (http://stackoverflow.com/questions/18155883/strange-behavio ur-of-the-pow-function), потому что [математика с плавающей запятой разбита] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken). –
'long long' не сможет сохранить результат умножения между двумя 64-значными числами. Фактически, он даже не может содержать ни одного 64-значного номера. У вас будет целочисленное переполнение, что приведет к неопределенному поведению. Вам понадобится собственный класс BigNumber. – AndyG
Я знаю, но я не могу улучшить алгоритм, поэтому я ищу помощь. Может быть, идеи. Может быть, есть математический трюк, когда я получил подсказку: 64 = 2^6 –