J'ai implémenté l'algorithme de multiplication de karatsuba. Je veux l'améliorer de cette façon que je peux multiplier 2 nombres à 64 chiffres mais je ne sais pas comment faire. On m'a donné un indice que les deux nombres contiennent un nombre de chiffres qui est une puissance de deux, mais cela ne me suggère rien. Pourriez-vous donner d'autres indices? Soit un indice mathématique ou un indice d'amélioration de l'algorithme.Multiplication de 2 nombres à 64 chiffres en 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;
}
Voici une autre indice: en utilisant 'pow()' [vous donnera de mauvaises réponses] (http://stackoverflow.com/questions/18155883/strange-behavio ur-of-the-pow-function) parce que [mathématique en virgule flottante est brisée] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken). –
'long long' ne sera pas en mesure de stocker le résultat d'une multiplication entre deux nombres de 64 chiffres. En fait, il ne peut même pas contenir un seul numéro à 64 chiffres. Vous aurez un débordement d'entier, ce qui conduit à un comportement indéfini. Vous aurez besoin de votre propre classe BigNumber. – AndyG
Je sais mais je ne peux pas améliorer l'algorithme, c'est pourquoi je cherche de l'aide. Peut-être des idées. Peut-être y a-t-il un tour de maths quand j'ai compris: 64 = 2^6 –