CyM98 << Suma de enteros largos >>

Lecciones anteriores:

ninguna

 
Google
Web www.oma.org.ar


No es posible representar cualquier número dentro de la computadora, debido a que ello utilizaría demasiada memoria y tiempo para realizar las operaciones. Por ello se los dividen en diferentes tipos según el lenguaje, pero hay una gran división:

  • Enteros: Sólo pueden representar a los números enteros en cierto rango (por ejemplo entre -32768 y 32767), pero los representan de manera exacta. (Además las operaciones que los utilizan son más rápidas.)
  • Punto Flotante: Almacenan por separado las cifras más significativas del número y por otro lado el exponente. Esto permite representar números en un rango mucho mayor, pero sólo se almacenan las primeras 10 o 15 cifras y el resto se pierde.
  • Cada uno de ellos tiene una versión "larga" que permite representar número más grandes y con mayor precisión.

Estas aproximaciones hacen que a veces una cuenta no de el resultado esperado, o que dos expresiones aparentemente iguales den resultados distintos, por ejemplo:

Print (1 + 10 ^ 20) - 10 ^ 20
'El resultado es 0!!!

Print 1 + (10 ^ 20 - 10 ^ 20)
'El resultado es 1.

Otro caso que es más frecuente en la vida real es al tratar de ver si un número es par, una forma de verlo es simplemente dividirlo por dos y ver si el resultado es entero, pero si el número original era muy grande entonces las últimas cifras se perdieron en los cálculos previos y por ello este método falla.

Dim a As Single
a = 11 ^ 20
If a / 2 = Int(a / 2) Then
     Print "11^20 es par"
Else
     Print "11^20 es impar"
End If
'Salida: 11^20 es par!!!

No siempre es necesario conocer todas las cifras, a veces alcanza con la última, como en el ejemplo anterior, y en otros casos alcanza con las primera (por ejemplo para aproximar la superficie de la tierra conociendo su radio). Si realmente quisiéramos operar con números muy largos conservando todas sus cifras, tenemos que realizar las operaciones "a mano", o sea hacer un programa que maneje los números de la misma manera que uno lo hace en lápiz y papel. En esta lección vamos a ver como sumar y restar (que es muy parecido). El producto y la división los vamos a dejar para más adelante.

Para hacer esto tenemos que almacenar las cifras en algún lado. Las dos formas más fáciles son usar un vector (array), o usar una cadena de texto. Para hacer más fácil el programa vamos a utilizar un vector de largo fijo e igual para todos los números, por ejemplo 100.

Las cifras van a estar ordenadas de atrás para adelante, o sea en la posición 1 van a estar las unidades, en la 2 las decenas, en la 3 las centenas y así siguiendo (En la posición vamos a poner el signo, así que por ahora no la usamos)

Entonces podemos escribir una función con tres parámetros, los dos primeros son los números a sumar y el último es donde almacenar el resultado.

Defint A-Z
Sub sumarpositivos (a() AS Integer, b() AS Integer, _
                                    resultado() AS Integer)
     Const largo = 100
     MeLlevo = 0' al principio no me llevo nada
     For i = 1 TO largo
          resultado(i) = a(i) + b(i) + MeLlevo
          ' sumo cifra por cifra
          If resultado(i) > 9 Then
               ' si es 10 o mas me llevo uno
               resultado(i) = resultado(i) - 10
               MeLlevo = 1
          Else
               ' sino no me llevo nada
               MeLlevo = 0
          End If
     Next i
     If MeLlevo = 1 Then
          'si me llevo una es que el numero era muy grande
          Print "Error en la suma: resultado muy grande"
          Error 6' Genera el error correspondiente
     End If
End Sub

En este ejemplo se utiliza esta función para calcular 2^50+5^35. En este caso también se da una idea de como usar esta función para multiplicar, pero no es muy eficiente.

    
Al restar aparece el problema de que el resultado puede ser negativo. Una solución fácil es generar un mensaje de error y listo. Pero queremos trabajar con todos los enteros positivos y negativos, para ello agregamos el signo del número que guardaremos en posición 0 del vector.

Si el número es positivo ponemos un 1, si es negativo un -1 y si es cero... realmente no importa, pero para evitar problemas pongamos un 0.

Modificando el programa anterior se puede lograr hacer una subrutina que reste dos números positivos o cero si el primero (a) es mayor o igual que el otro (b), llamamos a esta subrutina restarpositivos (queda como ejercicio). También podemos hacer una función que compare dos números positivos o cero y devuelva 1 si el primero es mayor, -1 si es menor y 0 si son iguales; a esta función la llamamos compararpositivos (también queda como ejercicio). Utilizando estas funciones podemos crear otras dos nuevas que permitan sumar y restar:

Defint A-Z
Sub sumar (a() AS Integer, b() AS Integer, resultado() AS Integer)
     Const largo = 100
     If a(0)=b(0) Then 'si tienen el mismo signo
          sumar a(), b(), resultado()
          resultado(0)= a(0)'el signo es el mismo
     Else
          If compararpositivos(a(), b())=1 Then' Si a>b
               restarpositivos a(),b(),resultado()
               resultado(0)= a(0)
          Else 'Si a<=b
               restarpositivos b(),a(),resultado()
               resultado(0)= b(0)
     End If
End Sub

Para restar lo que hacemos es cambiarle el signo al segundo número y luego sumarlo al primero usando la subrutina anterior.

Defint A-Z
Sub restar (a() AS Integer, b() AS Integer, resultado() AS Integer)
     Const largo = 100
     Dim menosb(0 To largo) as Integer
     For x=1 To 100
          menosb(x)= b(x)'copio las cifras
     Next x
     menosb(0)=-b(0)'invierto el signo
     sumar a(), menosb(), resultado()'
End Sub

También se puede hacer todo esto sin usar tantas funciones separadas aunque hay que tener más cuidado con los signos. También es interesante modificar estos programas de manera que los números puedan tener distinta cantidad de cifras.


Ejercicios:

  1. Reescribir los programas para sumar y restar, pero almacenando los números en cadenas de texto.

  2. Hacer una función que indique si un número largo es múltiplo de 3. Usarla para ver si 2^50+5^35 es múltiplo de 3.
    (Nota:
    podés ver como calcular 2^50+5^35 en este ejemplo)

  3. Escribir la función que indica si un número largo es mayor que otro. Comparar 2^50 con 5^35

  4. La sucesión de Fibonacci se define de la siguiente manera : f(0)=0; f(1)=1; y si n>1 entonces f(n)=f(n-1)+f(n-2). Calcular la suma de las cifras de f(1000).

Ejercicios extra :

  1. Calcular la ultima cifra de f(1000000)
    (Sugerencia no usar números largos, porque son muy lentos.)

  2. Repasar el método para multiplicar y dividir con lápiz y papel antes de que aparezca la continuación de esta lección. :)

Lecciones siguientes:

Bases de numeración Comp. Mate.

Pendiente: Producto de enteros largos

 

La idea es que hagan los ejercicios y piensen que otras cosas interesantes se pueden hacer relacionadas con estos temas. Cuéntennos lo que consiguieron y pregunten lo que no les salió. Envíen sus preguntas, dudas, sugerencias, experiencias y propuestas. Nuestra dirección es cym98@oma.org.ar .

También nos gustaría saber tu opinión sobre esta clase. Les pedimos que se tomen unos instantes y contesten estas preguntas. Con tu ayuda podremos hacer un curso cada vez mejor.

¿Cuál es tu calificación general de esta clase?

No entendí nada   Mala   Regular   Buena   Muy buena

El contenido de esta clase te resultó:

Nuevo   Conocido en parte   Conocido

El contenido de esta clase te pareció:

Difícil   Regular   Fácil

Los problemas de esta clase te parecieron:

Difíciles   Regulares   Fáciles

Comentarios, preguntas, sugerencias:

Agregar más información o una nueva lección sobre:

Funciones y subrutinas (Sub, Function, Procedure, ...)

Vectores y Matrices (Array, X(7), X[7], ...)

Gererando errores (Error, ...)

Nombre y apellido (opcional):

E-mail (opcional):

    


OmaNet   Curso CyM98 OmaNet - Educación Interactiva
   
www.oma.org.ar/omanet | omanet@oma.org.ar
mensajes: webmaster@oma.org.ar
duty free alcohol usa duty free cigarettes where to buy cigars duty free cosmetics duty free fragrances prices buy tobacco duty free