[RETO] Determinar Número Perfecto

Iniciado por Miseryk, 23 Octubre 2013, 11:44 AM

0 Miembros y 1 Visitante están viendo este tema.

Miseryk

Cita de: 79137913 en 23 Octubre 2013, 16:34 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
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

79137913

#11
HOLA!!!

Hice una pequeña prueba  con el maximo numero que soporta tu funcion y solo una llamada:


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 (vb) [Seleccionar]
Lastnum = Numero mod 10

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Miseryk

#12
Código Completo:

Código (vb) [Seleccionar]

Option Explicit

'6
'28
'496
'8128
'33550336
'8589869056
'137438691328
'2305843008139952128

Public Function Misery_MOD(ByVal dividendo As Double, ByVal divisor As Double) As Double
'x / y = z
'y * z + R = x

'10 / 3 = 3,333
'10 / 3 = 3
Misery_MOD = dividendo - (divisor * Fix(dividendo / divisor))
End Function

Public Function IsPerfect(ByRef numero As Double) As Boolean
Dim loopc As Double
Dim calc As Double

Dim LastNum As Byte

Dim Max As Variant

Max = Fix(CDbl(numero) / CDbl(2))

'By 79137913
LastNum = numero Mod 10

If LastNum = 6 Or LastNum = 8 Then
    For loopc = Max To 1 Step -1
        'If numero Mod loopc = 0 Then
        If Misery_MOD(numero, loopc) = 0 Then
            calc = calc + loopc

            If calc > numero Then
                IsPerfect = False
                Exit Function
            End If
        End If
    Next loopc
End If

IsPerfect = (calc = numero)
End Function

Private Sub Form_Load()
'MsgBox 33550336 Mod 10
MsgBox IsPerfect(33550336)
End
End Sub


Modificación_2
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Miseryk

Cita de: 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:


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 (vb) [Seleccionar]
Lastnum = Numero mod 10

GRACIAS POR LEER!!!

Wow, interesante, no se me había ocurrido.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Miseryk

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.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

79137913

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!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Miseryk

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
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Miseryk

#17
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.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Miseryk

Cita de: 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 (vb) [Seleccionar]
Private Function IsPerfect(N As Double) As Boolean
   Dim Sum As Double
   Dim Aux As Double
   Aux = N / 2
   Sum = 1 + Aux
   Do While Aux > 2
       If Fix(Aux / 2) < Aux / 2 Then
           Aux = Aux + 1
       End If
       Aux = Aux / 2
       Sum = Sum + Aux
   Loop
   IsPerfect = (N = Sum)
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
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

79137913

HOLA!!!

:O

Lo soluciono el lunes!

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*