2011-06-10 1 views
1

J'écris ma propre classe bignum pour fonctionner sur de grands nombres. Jusqu'à présent, j'ai surchargé les operator= et operator+. Comment puis-je effectuer une longue division?Divison Bignum et affectation de valeur en C++

De plus, je ne peux maintenant affecter que des valeurs dans la plage des entiers à l'objet bignum. Comment attribuer des valeurs qui ne sont pas comprises dans la plage int? Est-il possible de le faire sans cordes?

#include <iostream> 

using namespace std; 
class bignum 
{ 
public: 
    int number[20]; 
    bignum operator + (bignum); 
    bignum operator = (int); 
    void output() 
}; 

bignum bignum::operator= (int j) 
{ 
    int f; 
    f=j; 
    for(int k=0; k<=19; k++) 
    { 
     number[k]=0; 
    } 
    for(int l=19; l>=0,f>0; l--) 
    { 
     number[l]=(f%10); 
     f/=10; 
    } 
} 

bignum bignum::operator+ (bignum b) 
{ 
    bignum a; 
    int carry=0; 
    for(int k=0; k<=19; k++) 
    { 
     a.number[k]=0; 
    } 
    for(int i=19; i>=0; i--) 
    { 
     a.number[i]= number[i]+b.number[i]+a.number[i]; 
     if(a.number[i]>9) 
     { 
     carry=(a.number[i]/10); 
     a.number[i-1]+=carry; 
     a.number[i]=(a.number[i]%10); 
     } 
    } 

    return a; 
} 

int main() 
{ 
    bignum a,b,c; 
    a=9999; 
    b=a+a; 
    //for(int k=1; k<=9; k++) 
    //b.number[k]=0; 
    //b=a+a; 
    for(int k=0; k<=19; k++) 
    cout<<b.number[k]; 
    cin.get(); 
} 
+0

Si vous avez besoin de travailler avec de très grands nombres, alors les algorithmes d'aproximation sont la solution. Il est également préférable d'utiliser des chaînes hexadécimales plutôt que des décimales pour l'assignation (beaucoup moins de CPU mangeant pour encoder les hexs de décodage si vos bignums utilisent une forme binaire de représentation) – Spektre

Répondre

1

Pour l'attribution de grands nombres, les chaînes sont généralement utilisées. Cela n'arrive généralement qu'à l'interface de vos calculs et n'est donc pas un problème. Une autre façon serait d'avoir un constructeur de template qui prend une gamme de caractères que vous interprétez comme un nombre de Compliments de deux (je préfère cette méthode, mais je n'ai pas vu l'utiliser très souvent). Si vous êtes sérieux au sujet de l'implémentation d'une classe BigNum, alors je vous suggèrerais de lire sur les modèles d'expression afin de réduire le coût des temporaires dans un code naturel.

Questions connexes