Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Miseryk en 23 Octubre 2013, 11:44 am



Título: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 11:44 am
Hola a todos, los invito a que programen a gusto si un número es perfecto o no.

Cómo funciona un número perfecto?

Un número es perfecto, cuando la SUMA de TODOS sus divisores, evadiendo a si mismo, es igual a ese número.

Ej:

6: 1+2+3 = 6
28: 1+2+4+7+14 = 28
etc

Lista:
6
28
496
8128
33550336
8589869056
137438691328
2305843008139952128

Valoro pensamientos/deducciones propias :D


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: ivancea96 en 23 Octubre 2013, 12:09 pm
No lo pillo.
los invito a que programen a gusto si un número es perfecto o no.
¿Si un número es perfecto o no? Los números perfectos, como bien explicaste, son los que cumplen esa condición.
¿Se trata de descubrir cuales de esos números no es erfecto o algo así?
xD


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: 79137913 en 23 Octubre 2013, 13:18 pm
HOLA!!!

Hay que crear un verificador de numeros perfectos o un generador?

GRACIAS POR LEER!!!


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 14:12 pm
A lo que me refiero es que el usuario ingrese un número en un textbox y al hacer click en un button le informe si el número ingresado es perfecto o no. :P


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Mad Antrax en 23 Octubre 2013, 14:50 pm
Es más divertido hacer un generador. Mola mucho programar funciones recursivas


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: 79137913 en 23 Octubre 2013, 15:05 pm
HOLA!!!

Que comience el reto!

Ejemplo de la funcion:
Código
  1. Private Function IsPerfect(N as double) as Boolean

Si quieren hacer una funcion que devuelva el x numero perfecto aqui la funcion:
Código
  1. Private Function GetPerfect(N as  Long) as double
y que devuelva el N numero perfecto de la lista!

GRACIAS POR LEER!!!


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Slava_TZD en 23 Octubre 2013, 15:15 pm
Ya contareis cuanto os tarda en comprobar el último número, lo acabo de hacer en Perl y lo cerré porque mi macTrasto se puso hirviendo.


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: 79137913 en 23 Octubre 2013, 15:56 pm
HOLA!!!

Mi funcion puede verificar los numeros perfectos sin problema, probe con el ultimo que esta aca y lo verifica en menos de 0,1 ms .-

Para que vean que lo que importa es el algoritmo no el lenguaje ;)

Código
  1. Private Function IsPerfect(N As Double) As Boolean
  2.    Dim Sum As Double
  3.    Dim Aux As Double
  4.    Aux = N / 2
  5.    Sum = 1 + Aux
  6.    Do While Aux > 2
  7.        If Fix(Aux / 2) < Aux / 2 Then
  8.            Aux = Aux + 1
  9.        End If
  10.        Aux = Aux / 2
  11.        Sum = Sum + Aux
  12.    Loop
  13.    IsPerfect = (N = Sum)
  14. End Function

Superenme ;)

GRACIAS POR LEER!!!


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 16:28 pm
Mi código, con un par de deducciones que hice ;)

Código
  1. Public Function IsPerfect(ByRef numero As Double) As Boolean
  2. Dim loopc As Double
  3. Dim calc As Double
  4.  
  5. Dim NumStr As String
  6. Dim LastNum As Byte
  7.  
  8. NumStr = CStr(numero)
  9. LastNum = CByte(Mid(NumStr, Len(NumStr), 1))
  10.  
  11. Dim Max As Variant
  12.  
  13. Max = Fix(CDbl(numero) / CDbl(2))
  14.  
  15. If LastNum = 6 Or LastNum = 8 Then
  16.    For loopc = Max To 1 Step -1
  17.        'If numero Mod loopc = 0 Then
  18.        If numero Mod loopc = 0 Then
  19.            calc = calc + loopc
  20.  
  21.            If calc > numero Then
  22.                IsPerfect = False
  23.                Exit Function
  24.            End If
  25.        End If
  26.    Next loopc
  27. End If
  28.  
  29. IsPerfect = (calc = numero)
  30. End Function
  31.  

Modificación.


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: 79137913 en 23 Octubre 2013, 16:34 pm
HOLA!!!

Me parece o alguien tomo de base mi ejemplo funcion... :silbar: :silbar: :silbar: :silbar: :silbar:

P.D: tu funcion da OVERFLOW en esta linea cuando se inserta el numero 2305843008139952128 :
Código
  1.       If numero Mod loopc = 0 Then

GRACIAS POR LEER!!!


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 16:36 pm
HOLA!!!

Me parece o alguien tomo de base mi ejemplo funcion... :silbar: :silbar: :silbar: :silbar: :silbar:

GRACIAS POR LEER!!!

jajaja sí, yo a las funciones las llamo asd o sdav jajaja


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: 79137913 en 23 Octubre 2013, 16:47 pm
HOLA!!!

Hice una pequeña prueba  con el maximo numero que soporta tu funcion y solo una llamada:
(http://i.imgur.com/PP1ZaCr.png)

For the record:
Mi funcion recien empieza a tener un tiempo registrable luego de las 1000 llamadas (4ms) con 10000 llamadas llega a 47ms!
 
Y por supuesto...
Con el numero: 2305843008139952128

@Miseryk :
En vez de buscar el ultimo digito de esa manera buscalo asi, ya que tu funcion no acepta numeros mayor que long te va a servir:
Código
  1. Lastnum = Numero mod 10

GRACIAS POR LEER!!!


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 16:57 pm
Código Completo:

Código
  1. Option Explicit
  2.  
  3. '6
  4. '28
  5. '496
  6. '8128
  7. '33550336
  8. '8589869056
  9. '137438691328
  10. '2305843008139952128
  11.  
  12. Public Function Misery_MOD(ByVal dividendo As Double, ByVal divisor As Double) As Double
  13. 'x / y = z
  14. 'y * z + R = x
  15.  
  16. '10 / 3 = 3,333
  17. '10 / 3 = 3
  18. Misery_MOD = dividendo - (divisor * Fix(dividendo / divisor))
  19. End Function
  20.  
  21. Public Function IsPerfect(ByRef numero As Double) As Boolean
  22. Dim loopc As Double
  23. Dim calc As Double
  24.  
  25. Dim LastNum As Byte
  26.  
  27. Dim Max As Variant
  28.  
  29. Max = Fix(CDbl(numero) / CDbl(2))
  30.  
  31. 'By 79137913
  32. LastNum = numero Mod 10
  33.  
  34. If LastNum = 6 Or LastNum = 8 Then
  35.    For loopc = Max To 1 Step -1
  36.        'If numero Mod loopc = 0 Then
  37.        If Misery_MOD(numero, loopc) = 0 Then
  38.            calc = calc + loopc
  39.  
  40.            If calc > numero Then
  41.                IsPerfect = False
  42.                Exit Function
  43.            End If
  44.        End If
  45.    Next loopc
  46. End If
  47.  
  48. IsPerfect = (calc = numero)
  49. End Function
  50.  
  51. Private Sub Form_Load()
  52. 'MsgBox 33550336 Mod 10
  53. MsgBox IsPerfect(33550336)
  54. End
  55. End Sub
  56.  

Modificación_2


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 16:58 pm
HOLA!!!

Hice una pequeña prueba  con el maximo numero que soporta tu funcion y solo una llamada:
(http://i.imgur.com/PP1ZaCr.png)

For the record:
Mi funcion recien empieza a tener un tiempo registrable luego de las 1000 llamadas (4ms) con 10000 llamadas llega a 47ms!
 
Y por supuesto...
Con el numero: 2305843008139952128

@Miseryk :
En vez de buscar el ultimo digito de esa manera buscalo asi, ya que tu funcion no acepta numeros mayor que long te va a servir:
Código
  1. Lastnum = Numero mod 10

GRACIAS POR LEER!!!

Wow, interesante, no se me había ocurrido.


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 17:29 pm
Estuve probando ésto en .NET que soporta números muy grandes, y la función que hiciste en números muy grandes retorna True en todos los números, estoy pasándolo a VB.NET para que lo veas mejor.


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: 79137913 en 23 Octubre 2013, 17:38 pm
HOLA!!!

Esto es VB6!!!!!!!! (con el tono de "ESTO ES ESPARTAAAAAA")

Que el No-Compilador de Net sea idiota no es mi problema.-

GRACIAS POR LEER!!!


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 18:14 pm
Nono, es cierto, me faltó una conversión de tu función a UInt64, el código funciona bien y muy rápido :D :D


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 23 Octubre 2013, 19:19 pm
Voy a esperar a ver quién más postea algún código mientras mejoro el mio.

Estoy en .NET (solamente por el número que uso para testear la función) utilizando como prueba el número perfecto 2305843008139952128

Con respecto a los resultados en y con:
SO: Windows 7 Ultimate 64 bits
Procesador: Intel(R) Core(TM) i5-3570K CPU @ 3.40Ghz 3.40GHz
Memoria instalada (RAM): 16,0 GB

79137913:
Número: 2305843008139952128
Resultado: True
Tiempo Milisegs: 0,0084 (EL MÍNIMO TIEMPO POSIBLE DE DEMASIADOS INTENTOS)




PD: el mio no lo muestro porque necesito una computadora quántica para que me diga el tiempo que tarda, pero estoy en éso.


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: Miseryk en 25 Octubre 2013, 18:23 pm
HOLA!!!

Mi funcion puede verificar los numeros perfectos sin problema, probe con el ultimo que esta aca y lo verifica en menos de 0,1 ms .-

Para que vean que lo que importa es el algoritmo no el lenguaje ;)

Código
  1. Private Function IsPerfect(N As Double) As Boolean
  2.    Dim Sum As Double
  3.    Dim Aux As Double
  4.    Aux = N / 2
  5.    Sum = 1 + Aux
  6.    Do While Aux > 2
  7.        If Fix(Aux / 2) < Aux / 2 Then
  8.            Aux = Aux + 1
  9.        End If
  10.        Aux = Aux / 2
  11.        Sum = Sum + Aux
  12.    Loop
  13.    IsPerfect = (N = Sum)
  14. End Function

Superenme ;)

GRACIAS POR LEER!!!

Mientras estuve tratando de crear un algoritmo, me dí cuenta que esa función retorna mal algunos valores como por ejemplo:

al verificar con el número 2 retorna Verdadero el cual no es perfecto.
al verificar con el número 12 retorna Verdadero el cual no es perfecto.
al verificar con el número 14 retorna Verdadero el cual no es perfecto.
al verificar con el número 24 retorna Verdadero el cual no es perfecto.
etc


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: 79137913 en 26 Octubre 2013, 04:57 am
HOLA!!!

:O

Lo soluciono el lunes!

GRACIAS POR LEER!!!


Título: Re: [RETO] Determinar Número Perfecto
Publicado por: rob1104 en 8 Noviembre 2013, 02:24 am
Aui va mi función, es muy rapida  :rolleyes:
Código
  1. Private Function esNumeroPerfecto(ByVal numero As Double) As Boolean
  2.        Dim aux(7) As Double
  3.        Dim i As Integer
  4.        aux(0) = 6
  5.        aux(1) = 28
  6.        aux(2) = 496
  7.        aux(3) = 8128
  8.        aux(4) = 33550336
  9.        aux(5) = 8589869056
  10.        aux(6) = 137438691328
  11.        aux(7) = 2305843008139952128
  12.  
  13.        For i = 0 To 7
  14.            If numero = aux(i) Then
  15.                Return True
  16.            End If
  17.        Next
  18.        Return False
  19. End Function


Jaja fuera bromas, esto es lo que pude hacer, aunque con numeros muy grandes tarda una eternidad  :-\
Código
  1. Este se tarda una eternidad en comprobar los ultimos 2 numeros de la lista
  2. Private Function esNumeroPerfecto(ByVal numero As Double) As Boolean
  3.        Dim aux As Double = 1
  4.        Dim aux2 As Double = 0
  5.        Dim sum As Double = 0
  6.        While aux <= (numero / 2)
  7.            aux2 = numero Mod aux
  8.            If aux2 = 0 Then
  9.                sum += aux
  10.            End If
  11.            aux += 1
  12.        End While
  13.        Return (sum = numero)
  14.    End Function

Saludos