Enviado por Llyn en Algoritmos, C/C++
Suma de dos números en base ‘n’
Tenemos dos números como cadena de caracteres, ambas en la misma base, y nuestro objetivo es sumarlos. Una opción es utilizar la función strtol() para convertir las cadenas a números y entonces sumarlos, y convertir la suma de nuevo a cadena con _ltoa(). Esto funciona siempre y cuando los números no sean ni muy grandes (overflow) ni muy pequeños (underflow). No obstante, tambien se puede usar un procedimiento de pseudo-suma, la cual nos quita esta limitación.
El procedimiento seria de este modo con strtol():
string sum(const string & a, const string & b, int base) {
long la = strtol(a.c_str(), NULL, base);
long lb = strtol(b.c_str(), NULL, base);
char psz[sizeof(long) * 8 + 1];
*_ltoa(la + lb, psz, base);
int err;
_get_errno(&err);
if (err == ERANGE) throw "Valor o muy pequeño o muy grande.";
return psz;
}
Ahora puede ocurrir que necesitemos sumar números muy grandes y para eso podemos utilizar una operación de pseudo-suma como la siguiente:
string sum(const string & a, const string & b, int base) {
char itc[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int cti['Z' + 1];
for (int i = 0; i < 10; ++i) cti[i + '0'] = i;
for (int i = 0; i < 26; ++i) cti[i + 'A'] = i + 10;
string::const_reverse_iterator ia = a.rbegin(), ib = b.rbegin();
string s;
int h = 0;
while (ia != a.rend() || ib != b.rend() || h != 0) {
if (ia != a.rend()) h += cti[* ia++];
if (ib != b.rend()) h += cti[* ib++];
s = itc[h % base] + s;
h /= base;
}
return s;
}
Nota: Aún no ofrece soporte para números negativos.
Posts Relacionados
- Transformar numero de base n a base k Buenas. Realmente lo que trata este post es poder transformar...
- Sumar numeros muy grandes c++ Buenas. Resolviendo un pequeño problema me encontre con que debía...
- Cargar un comboBox desde la base de datos en csharp Buenas. Seguimos un poco en la onda de .NET, veamos...
- Clase BigInteger en java Buenas. A diferencia de lo que muchos creían no habia...
- DFS DFS, acrónimo para Depth-First Search, en español Búsqueda en Profundidad,...
- 500! Buenas. Hace unos días en un post sobre permutaciones dabamos...
Menciones/Notificaciones
- Kernel Error | Clase BigInteger en java - [...] suma o una división pueden complicarse muchísimo, ya en su momento tanto Llyn como yo hablamos de sumar numeros ...



Hola me parece muy interesant solo q no me qedo muy claro tal ves es el problema de lenguaje no c si lo pudieses pasar a Java
Usandono entiendo ers una tontería
Usando