4.2. Divisores.

Teniendo los números enteros a y b, a es divisor de b si se cumple que a divide a b sin dejar residuo, esto quiere decir que existe un número entero k tal que b = ka y que b ≡ 0 mod a. Si a es divisor de b se representa simbólicamente como a|b, y en caso de que no lo divida se representa como ab.

Un número a es divisor propio de b si a divide a b sin dejar residuo y a b. Designamos a d(n) como el conjunto de los divisores propios de n y a s(n) como la suma de todos estos divisores. Por ejemplo:
d(5) = {1} s(5) = 1
d(12) = {1,2,3,4,6} s(12) = 1 + 2 + 3 + 4 + 6 = 16


Problema ejemplo


Perfección

Problema
Del artículo Teoría de Números de la Enciclopedia Microsoft Encarta de 1994: “Si a, b y c son enteros tales que a = bc, a a se le conoce como múltiplo de b o c, y b o c se le llama divisor o factor de a. En el caso de que c no sea 1 o -1, a b se le llama divisor propio de a. Los números pares, incluyendo al 0, todos son múltiplos de 2, por ejemplo, -4, 0, 2, 10; los números impares (nones) son los enteros que no son pares, por ejemplo, -5, 1, 3, 9. Un número perfecto es un entero positivo que es igual a la suma de todos sus divisores propios positivos; por ejemplo, 6, que es igual a 1 + 2 + 3, y 28, que es igual a 1 + 2 + 4 + 7 + 14, son números perfectos. Un número es imperfecto en caso de no ser perfecto, y puede ser deficiente o abundante de acuerdo a si la suma de los divisores propios es menor o mayor al número mismo. Por lo tanto, 9, con divisores 1 y 3, es deficiente; 12, con divisores propios 1, 2, 3, 4 y 6 es abundante.

Dado un número, determinar si es perfecto, abundante o deficiente.

Entrada
Una lista de n enteros positivos (ninguno mayor a 60 000), con 1 < n < 100. Un 0 marcará el final de la lista

Salida
La primera línea de salida debe decir PERFECTION OUTPUT. Las siguientes n líneas de salida deberán ser una lista que indique para cada entero si es perfecto (PERFECT), deficiente (DEFICIENT) o abundante (ABUNDANT). El formato es importante: los enteros de la salida deben estar justificados a 5 espacios, seguido por dos espacios en blanco, y por la descripción del entero. La línea final de la salida debe ser END OF OUTPUT.

Solución: Si n tiene algún divisor entonces los podemos representar como n = ab, y alguno de sus dos divisores tiene que ser menor o igual que la raíz de n, ya que si los dos fueran mas grandes que la raíz su producto sería ( + d)( + e), donde d y e son positivos, el cual es claramente mayor a n.

Por lo anterior hacemos un recorrido hasta la raíz de n, si encontramos un número a que divida a n lo sumamos al total y también añadimos a b (que sería ). El único problema es que cuando n tiene raíz exacta, a = b y estaríamos contando dos veces un divisor, por lo que hacemos una revisión al final.


Código


Iniciamos declarando sólo una variable: n, que es el número a revisar (líneas 1 y 2).

En las líneas 4 a 14 tenemos la función divisores que es precisamente donde vamos a ver cuantos divisores tiene el número. Declaramos en la línea 5 las variables locales: i es una variable de ciclo y s es la suma de todos los divisores. Inicializamos la suma a uno (línea 7) y en las líneas 8 y 9 vamos agregando los divisores a la suma. En la línea 10 revisamos si el número es un cuadrado, y en caso de que lo sea, le quitamos el divisor que sumamos de más. Terminamos poniendo si el número es deficiente, perfecto o abundante, según si la suma es menor, igual o mayor que n.

Entre las líneas 16 y 25 tenemos la parte principal del programa. Las líneas 17 y 24 solo son parte del formato de salida del problema. Leemos el número a revisar n (la primera vez en la línea 18, las siguientes en la 22). En la línea 21 imprimimos el resultado de la función divisores.


Información adicional

Euclides demostró que la fórmula 2n-1(2n -1) siempre da como resultado un número perfecto cuando 2n -1 es un número primo. Tiempo después, Euler demostró que tal fórmula sirve para encontrar todos los números perfectos pares. Hasta la fecha no se han encontrado números perfectos impares y se cree que no existen, aunque no ha sido demostrado.


Casos ejemplo

Entrada: 81
Desarrollo: s = 1
81 ≡ 1  mod 2
81 ≡ 0  mod 3, s = 1 + 3 + 27 = 31
81 ≡ 1  mod 4
81 ≡ 1  mod 5
81 ≡ 3  mod 6
81 ≡ 4  mod 7
81 ≡ 1  mod 8
81 ≡ 0  mod 9, s = 31 + 9 + 9 = 49
92 = 81, s = 49 –9 = 40
40 < 81
Salida:    81  DEFICIENT

Entrada: 28
Desarrollo: s = 1
28 ≡ 0  mod 2, s = 1 + 2 + 14 = 17
28 ≡ 1  mod 3
28 ≡ 0  mod 4, s = 17 + 4 + 7 = 28
28 ≡ 3  mod 5
52 < 28
28 = 28
Salida:    28  PERFECT

Entrada: 96
Desarrollo: s = 1
96 ≡ 0  mod 2, s = 1 + 2 + 48 = 51
96 ≡ 0  mod 3, s = 51 + 3 + 32 = 86
96 ≡ 0  mod 4, s = 86 + 4 + 24 = 114
96 ≡ 1  mod 5
96 ≡ 0  mod 6, s = 114 + 6 + 16 = 136
96 ≡ 2  mod 7
96 ≡ 0  mod 8, s = 136 + 8 + 12 = 156
96 ≡ 6  mod 9
92 < 96
156 > 96
Salida:    96  ABUNDANT


Código en C



Tiempo de ejecución

Lenguaje Fecha Tiempos [s] Memoria [Kb]
Ejecución Mejor Mediana Peor
Pascal 15-Ene-2006 0.000 0.000 0.000 0.940 308
C 16-Feb-2006 0.000 392


Otros problemas

Valladollid:

Ural:

Project Euler:

Saratov:

Sphere:





© Pier Paolo Guillen Hernandez
World of πer