feb 8, 2009

Enviado por 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

    1. 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

      Usando Internet Explorer 6.0 Internet Explorer 6.0 en Windows XP Windows XP
    2. avatar
      gggggggg dice:

      no entiendo ers una tontería

      Usando Internet Explorer 6.0 Internet Explorer 6.0 en Windows XP Windows XP

    Menciones/Notificaciones

    1. 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 ...

    Dejar una respuesta

    Debes ser Alojarse para enviar un comentario.