Autor Tema: ¿Cómo hago una suma usando cadenas?

0 Usuarios y 2 Visitantes están viendo este tema.

29 Julio, 2025, 02:15 am
Leído 2597 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Es que son números muy altos y mi lenguaje falla en usarlos a menos que sean cadenas.

Supongamos que tenemos:
Cadena1 = "99887766554433221100";
Cadena2 = "1234567890987654321";

El número en la cadena 1 siempre será mayor que el de la 2, y en general más largo.
Y no hay , ni negativos.

Esos datos deberían facilitar hallar una solución.

He pensado en esto:
Código: [Seleccionar]
// Lo que se quiere averiguar:
Resultado = "";
// Esto es el número que ponemos encima cuando la suma de números sobrepasa 10:
SumarExtra = 0;
// Esto indica qué caracteres se van a sumar, contando desde el último:
AnterioraObtener = 0;
Repetir mientras el largo de Cadena2 > AnterioraObtener
   AnterioraObtener++;
   // Obtenemos un caracter de la cadena 1 y 2:
   CaracterDe1aSumar = (tomamos el caracter en la posición ((largo de Cadena1)-AnterioraObtener))
   // es decir, en la 1er vuelta de este ciclo tomamos los últimos caracteres de cada cadena, en la próxima tomaremos los últimos-1, en la próxima los últimos-2, etc. Las posiciones se cuentan desde 0, por eso quizá los números les parecen raros. El último caracter no está en la posición igual al largo de la cadena, sino en eso -1.
   CaracterDe2aSumar = (tomamos el caracter en la posición ((largo de Cadena2)-AnterioraObtener))
   SumaDeLosCaracteres = (los sumanos como si fueran números, no hay problema porque son cortos, y le sumanos SumarExtra)
   Si SumaDeLosCaracteres > 9
      SumaDeLosCaracteres = SumaDeLosCaracteres-10
      SumarExtra = 1;
   sino
      SumarExtra = 0;
   fin del si
   Resultado = Concatenar Resultado y SumaDeLosCaracteres
fin del ciclo
DiferenciaDeLargo = Largo de Cadena1 - Largo de Cadena2
Si Cadena1 es más larga que Cadena2
   // Conseguir los caracteres que no fueron sumados:
   CaracteresFaltantes = (tomar los 1eros (DiferenciaDeLargo) caracteres de Cadena1).
   Si SumarExtra es 1
      // A CaracteresFaltantes hay que sumarle ese 1 a los caracteres mientras el resultado sea > 9
   fin del si
   // Concatenar CaracteresFaltantes con Resultado
sino si SumarExtra es 1
   Poner "1" delante de Resultado

¿Les parece que está bien o qué error le ven y cómo se corregiría?

Otro modo quizá más simple podría ser que si por ejemplo mi lenguaje tolera hasta el número 9007199254740992, que tiene 16 caracteres, puedo partir los números en 14 caracteres, sumarlos nomal, y... No sé bien luego, voy a tener que sumar strings como puse arriba ¿no? No parece más simple entonces.

¿Alguna alternativa?

29 Julio, 2025, 03:30 am
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
 Una función en Python  para sumar números guardados en strings sería así

Si a y b son números pero los tienes guardados como texto en la variable ax y bx como sigue

Código: [Seleccionar]

 # ax y bx  son strings con los dígitos de los números a=10000000000000000000000000000000000 y b=1111111111111111111111111111111 que deseas sumar
ax=str(10000000000000000000000000000000000)
bx=str(1111111111111111111111111111111)

#llamas  a la suma
print (suma(ax,bx))

#definicion de la funcion suma

def  suma(ax,bx):

   la=len(ax)
   lb=len(bx)

   s=""
   l=0
   if la>lb:
      c=0
      while c<(la-lb):
         bx="0"+ bx
         c=c+1
         l=len(bx)

   if la<lb:
      c=0
      while c<(lb-la):
         ax="0"+ ax
         c=c+1
       
         l=len(ax)
   if la==lb:
      l=la
   c=0
   ll=0
   while c<l:
   
      n=l-c-1
      s1=ax[n]
      ac=int(s1)
      s2=bx[n]
      bc=int(s2)
      sc=ac+bc+ll
      if sc>=10:
         s=str(sc-10)+s
         ll=1
      else:
         s=str(sc)+s
         ll=0
      c=c+1
   if ll==1:
      s=str(ll)+s
   return s

Puedes cambiar el código que no sea compatible con tu lenguaje , sin variar la estructura
Saludos  \(\mathbb {R}^3\)