#include <deque>
#include <utility>
#include <algorithm>
-#include <iomanip>\r
-\r
-#ifdef _WIN32\r
+#include <iomanip>
+
+#ifdef _WIN32
// VC++ no tiene la stdint.h, se agrega a mano
-#include "stdint.h"\r
-#else\r
-#include <stdint.h>\r
+#include "stdint.h"
+#else
+#include <stdint.h>
#endif
enum sign_type { positive, negative };
number(native_type n, sign_type sign = positive):
chunk(1, n), sign(sign) {}
- // TODO constructor a partir de string.
+ number(const std::string& str);
// Operadores
number& operator++ ()
number& operator+= (const number& n);
number& operator*= (const number& n);
- number& operator<<= (const size_type n);\r
- number& operator-= (const number& n);\r
+ number& operator<<= (const size_type n);
+ number& operator-= (const number& n);
bool operator< (const number& n);
// Devuelve referencia a 'átomo' i del chunk (no debería ser necesario
chunk.push_back(1);
}
-};\r
-\r
-template < typename N, typename E >\r
-number< N, E >::number(const std::string& str)\r
-{\r
- const N MAX_N = (~( (N)0 ) );\r
- E increment = 0;\r
- E acum = 0;\r
-\r
- unsigned length = origen.length();\r
- unsigned number_offset = 0;\r
-\r
- while (number_offset<length)\r
- {\r
- // si encuentro un signo + ó - corto\r
- if (!isdigit(origen[length-number_offset-1]))\r
- break;\r
-\r
- increment = (10*number_offset)*(origen[length-number_offset-1]-'0');\r
- if ((acum + increment) > MAX_N)\r
- {\r
- chunk.push_back(acum);\r
- }\r
-\r
- }\r
-\r
-\r
+};
+
+template < typename N, typename E >
+number< N, E >::number(const std::string& origen)
+{
+ const N MAX_N = (~( (N)0 ) );
+ E increment = 0;
+ E acum = 0;
+
+ unsigned length = origen.length();
+ unsigned number_offset = 0;
+
+ while (number_offset<length)
+ {
+ // si encuentro un signo + ó - corto
+ if (!isdigit(origen[length-number_offset-1]))
+ break;
+
+ increment = (10*number_offset)*(origen[length-number_offset-1]-'0');
+ if ((acum + increment) > MAX_N)
+ {
+ chunk.push_back(acum);
+ }
+
+ }
+
+
}
template < typename N, typename E >
number< N, E > tmp = n1;
tmp += n2;
return tmp;
-}\r
-\r
-template < typename N, typename E >\r
-number< N, E >& number< N, E >::operator-= (const number< N, E >& n)\r
-{\r
- //TODO IMPLEMENTAR\r
+}
+
+template < typename N, typename E >
+number< N, E >& number< N, E >::operator-= (const number< N, E >& n)
+{
+ //TODO IMPLEMENTAR
return *this;
-}\r
-\r
-template < typename N, typename E >\r
-number< N, E > operator- (const number< N, E >& n1, const number< N, E >& n2)\r
-{\r
- number< N, E > tmp = n1;\r
- tmp -= n2;\r
- return tmp;\r
-}\r
-\r
-\r
-template < typename N, typename E >\r
-bool number< N, E >::operator< (const number< N, E >& n)\r
-{\r
- number< N, E > n1 = *this;\r
- number< N, E > n2 = n;\r
-\r
- // igualo los largos\r
- n1.normalize_length(n2);\r
- n2.normalize_length(n1);\r
-\r
- // obtengo el largo \r
- size_type length = n1.chunk.size();\r
- size_type i = length - 1;\r
-\r
- // me voy fijando desde "la cifra" más significativa si alguno es menor que el otro\r
- // sigo iterando si son iguales hasta recorrer todo el número hasta la parte menos significativa\r
- while (i > 0)\r
- {\r
- if (n1[i]<n2[i])\r
- return true;\r
- if (n1[i]>n2[i])\r
- return false;\r
-\r
- i--;\r
- }\r
-\r
- // si llegué hasta acá es porque son iguales, por lo tanto no es menor estricto\r
- return false;\r
-\r
-}\r
+}
+
+template < typename N, typename E >
+number< N, E > operator- (const number< N, E >& n1, const number< N, E >& n2)
+{
+ number< N, E > tmp = n1;
+ tmp -= n2;
+ return tmp;
+}
+
+
+template < typename N, typename E >
+bool number< N, E >::operator< (const number< N, E >& n)
+{
+ number< N, E > n1 = *this;
+ number< N, E > n2 = n;
+
+ // igualo los largos
+ n1.normalize_length(n2);
+ n2.normalize_length(n1);
+
+ // obtengo el largo
+ size_type length = n1.chunk.size();
+ size_type i = length - 1;
+
+ // me voy fijando desde "la cifra" más significativa si alguno es menor que el otro
+ // sigo iterando si son iguales hasta recorrer todo el número hasta la parte menos significativa
+ while (i > 0)
+ {
+ if (n1[i]<n2[i])
+ return true;
+ if (n1[i]>n2[i])
+ return false;
+
+ i--;
+ }
+
+ // si llegué hasta acá es porque son iguales, por lo tanto no es menor estricto
+ return false;
+
+}
// efectúa un shifteo a izquierda del chunk, agregando 0s en los casilleros menos significativos
template < typename N, typename E >
while (chunk.size() < n.chunk.size())
{
chunk.push_back(0);
- }\r
-\r
- return *this;\r
-\r
+ }
+
+ return *this;
+
}
template < typename N, typename E >