The Pharcyde, que cracks!
24-06-2006
Hacía años que no veía este video, impresionante! con cameo de Beastie Boys incluido ;)
_method integer.n_perfectos
_for i _over 2.upto(15) # 31 es un valor de prueba para correr el bucle
_loop
_if i _mod 2 <> 0 _or i=2 # sólo nos interesan los números impares
# excepto el 2, único par primo.
_then
# Fórmula de Euclides para hallar números perfectos
x << 2.to_power(i-1)*(2.to_power(i)-1)
#inicializamos la suma de divisores propios
suma_partes<<0
# dividimos "x entre 2" con _div(para no obtener un valor
# flotante) y nos ahorramos la mitad del bucle. Evidentemente
# ningún número tiene un divisor propio mayor que su mitad.
_for j _over (x _div 2).downto(1)
_loop
_if x _mod j =0 # es divisor propio.
_then
# lo añadimos a la suma de divisores propios
suma_partes << suma_partes + j
# si la suma de divisores propios es mayor que el propio número
# no se trata de un número perfecto por lo que salimos del
# bucle.
_if suma_partes > x
_then
# salimos del bucle
# no es un número perfecto!!!
_leave
_endif
_endif
_endloop
# si la suma de divisores propios es igual que el número lo
# pintamos por pantalla.
_if x = suma_partes
_then
write(i, "-->",x," es un número perfecto!!!","Primo 2º->",
(2.to_power(i)-1).prime?)
_endif
_endif
_endloop
_endmethod
$