else
chunk.push_back(1);
}
-
+ // Propaga borrow a partir del 'átomo' i (resta 1 al 'átomo' i propagando
+ // borrow)
+ void borrow(size_type i)
+ {
+ if (chunk.size() >= i)
+ {
+ if (chunk[i] == 0)
+ {
+ borrow(i+1); // Overflow, pido prestado
+ chunk[i] = ~((N)0); //quedo con el valor máximo
+ }
+ else
+ {
+ --chunk[i]; //tengo para dar, pero pierdo uno yo
+ }
+ }
+ //else ERROR, están haciendo a-b con a>b
+ }
};
template < typename N, typename E >
template < typename N, typename E >
number< N, E >& number< N, E >::operator-= (const number< N, E >& n)
{
- //TODO IMPLEMENTAR
+ // minuendo - substraendo
+ number< N, E > minuend;
+ number< N, E > subtrahend;
+
+ // voy a hacer siempre el mayor menos el menor
+ if (*this < n)
+ {
+ minuend = n;
+ subtrahend = *this;
+ //minuendo < sustraendo => resultado negativo
+ minuend.sign = negative;
+ }
+ else
+ {
+ minuend = *this;
+ subtrahend = n;
+ //minuendo > sustraendo => resultado positivo
+ minuend.sign = positive;
+ }
+
+ native_type c = 0;
+ size_type ini = 0;
+ size_type fin = std::min(minuend.chunk.size(), subtrahend.chunk.size());
+ size_type i; //problema de VC++, da error de redefinición
+
+ //estoy seguro de que minuend > subtrahend, con lo cual itero hasta el size del
+ //menor de los dos. Si el otro es más grande, puede ser que esté lleno de 0's pero
+ //no puede ser realmente mayor como cifra
+ for (i = ini; i < fin; ++i)
+ {
+ // si no alcanza para restar pido prestado
+ if ((minuend.chunk[i] < subtrahend.chunk[i]))
+ {
+ minuend.borrow(i);
+ }
+
+ // resto el chunk i-ésimo
+ minuend.chunk[i] -= subtrahend.chunk[i];
+ }
+
+ //retorno el minuendo ya restado
+ *this = minuend;
return *this;
}