Listing 2: Addition and Subtraction routine


//add 2 BigNums
BigNum  BigNum::operator+(const BigNum &b){
 if (positive){
  if (b.positive){
     if (exp < b.exp) return (b + *this);
     else{
        BigNum a;
        a.exp = exp + 1;
        delete[] a.x; a.x = new int[a.exp+1];
        a.positive = 1; a.x[a.exp]=0;
        long carry=0; long temp;
        for (int i=0;i<=b.exp;i++){
          temp =
            long(x[i])+long(b.x[i])+carry;
          a.x[i] = temp % BASE;
          carry = temp/BASE;
        }
        for(i=b.exp+1;i<=exp;i++){
          temp = x[i] + carry;
          a.x[i] = temp % BASE;
          carry = temp/BASE;
        }
        if (!a.x[a.exp]) a.exp--;
        return a;
     }
  //a pos & b neg
  }else return (*this - (-b));
 }else{
      if (b.positive)
        return (b - (-*this)); //a neg
      else
        //a neg & b neg
        return (- (-*this) + (-b));
 }
}

//subtract a BigNum from another BigNum
BigNum BigNum::operator-(const BigNum &b){
  if (positive){
     if (b.positive){
      if (*this<b) return(-(b-*this));
      BigNum a; a.exp = exp;
      delete[] a.x; a.x = NULL;
      a.x = new int[a.exp+1];
      a.positive = 1; a.x[a.exp]=0;
      for (int i=0;i<=exp;i++) a.x[i]=x[i];
      for(i=0;i<=b.exp;i++){
         long temp = a.x[i] - b.x[i];
         if (temp < 0){
           a.x[i+1]-=1;
           temp+=BASE;
         }
         a.x[i] = temp;
      }
      i = b.exp+1;
      while(a.x[i]<0){
        a.x[i++]+=BASE;a.x[i]-=1;
      }
      while(!a.x[a.exp] && a.exp) a.exp--;
      return a;
     }else
       //a pos & b neg
       return (*this + (-b));
  }else{  //a negative
     if (b.positive)return (-(b + (-*this)));
     else return(b-*this);
  }
}
//End of File