2013-03-31 1 views
-3

J'ai commencé à écrire une bibliothèque bignum, avec un vecteur de shorts pour représenter la valeur, une fonction d'impression et un support de nombre négatif. Cependant, je ne peux pas trouver un bon moyen de mettre en œuvre plus long, comme celui-ci:Comment implémenter complètement l'addition/multiplication de bignum en C++

123 
+123 
---- 
246 

Le dernier code je ne donne pas une erreur de segmentation est la suivante:

void add(unsigned long long b) 
    { 
     for(long long i=v.size()-1;i>=0;--i) 
     { 
      if((b+v[i])<10) 
       v[i]+=b; 
      else // Carry 
       { 
        if(i==0) // 1st digit 
        { 
         v.push_front(1); // Can't be more than 1 
        } 
        else 
         v[i-1]++; // Increment digit to the left 
       } 

     } 
    } 

, mais plus d'un carry est pas correct (10 + 1 est 21)

EDIT: Il est mis en œuvre en tant que classe

+4

L'addition est simple. Vous ajoutez des chiffres, et si la somme est plus grande qu'un seul chiffre peut contenir, avoir un report pour l'endroit suivant. –

+1

À moins que vous ne souhaitiez vraiment les chiffres de base-10, les bibliothèques bignum utilisent généralement la base-B, où B = 2 ** w' et 'w' est le nombre de bits du type entier (non signé). –

+1

"* ça ne fait rien *" Quand 'v.size()' est '1', quel travail voyez-vous cette fonction? –

Répondre

0

Tenir compte passer 11 à la fonction:
Si vector[i]> = 0, puis b+vector[i]> 11, donc b+vector[i]<10 ne sera jamais vrai.

Quelques autres:

  • Vous utilisez vector et v, je suis assez sûr qu'il ne devrait y être.

  • i>0 doit être i>=0, sinon la boucle ignore le premier élément.

  • Chaque élément représentant un chiffre est un peu exagéré. Vous pouvez avoir chaque élément représente 0-65535 (plage de non signé court). Il suffit de changer 10 à 65535 ci-dessous. Ou 0-10000 peut également avoir du sens, car alors la décomposition en chiffres serait plus simple.

  • La fonction ne devrait-elle pas prendre en paramètre un paramètre de type de votre classe BigNum? Une boucle du premier au dernier élément aurait plus de sens.

Une meilleure (non testé) fonction add peut ressembler à:

const int BASE = 10; 
void add(unsigned long long b) 
{ 
    for (int i = 0; b > 0 && i < v.size(); ++i) 
    { 
     unsigned long long val = b + v[i]; 
     b = val/BASE; 
     v[i] = val % BASE; 
    } 
    // if adding more digits 
    while (b > 0) 
    { 
     v.push_back(b % BASE); 
     b /= BASE; 
    } 
} 
+0

Oui, j'ai le vecteur appelé v, mais pour plus de clarté, je l'ai changé en vecteur – theunamedguy

+0

Je ne peux pas mettre i> = 0 comme il est, parce que je ne suis pas signé, et provoquera un segfault, donc j'ai changé 'i' à signé – theunamedguy

+0

Merci pour le conseil, maintenant 1 + 1 fonctionne! Maintenant, travaillant sur le transport ... – theunamedguy