[RETO] ¿Fácil? Buscando los números de Lychrel

Iniciado por raul338, 18 Agosto 2010, 14:54 PM

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

[D4N93R]

#10
Ahí se los dejo, n se que tan weno sea eso, porque ni lo probé, no se si funciona en VB6 xD

me avisan xD
Código (vb) [Seleccionar]

Public Function IsLychrelNumberDanger(ByVal numero As Double, ByRef numeroFinal As Double, ByRef actualit As Integer, Optional ByVal maxVueltas As Long = 60) As Boolean
        actualit = actualit + 1
        Dim original As String
        original = CStr(numero)
        Dim reverse As String
        reverse = StrReverse(original)

        If original = reverse Then
            IsLychrelNumberDanger = False
        End If

        If actualit = maxVueltas Then
            IsLychrelNumberDanger = True
        End If
        numeroFinal = CDbl(reverse) + numero
        IsLychrelNumberDanger = IsLychrelNumberDanger(numeroFinal, numeroFinal, actualit, maxVueltas)
End Function




Saludos!

PD: Primero y ultimo que hago en VB xD
PD2: gracias a raul por portar el code a vb6 xD

Novlucker

Ahora entiendo por que decías que no servía cuando lo pasabas de VB.NET a VB6 :xD

El de raul338 es el "más válido", a la próxima le pongo todas las verificaciones esas, yo simplemente las omití porque entendí que los números de prueba iban a ser válidos para la función :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

raul338

jajaja las validaciones las agregue al final :P

D4N93R propone agregar un parametro con el numero de iteraciones dado para llegar al resultado final, que dicen, lo ponemos? (seria devolver i en mi caso :xD)

Novlucker

Eso es porque necesita una excusa para poder agregar una parámetro más a la función, el que usa para la recursividad :xD

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Tokes

Buen día, gente. Aquí les dejo mi aporte:

Private Function EsNumLychrel4(ByVal num As Long, ByRef numeroFinal, Optional ByVal iteraciones As Long = 50) As Boolean
Dim n As Double, snrev As String
    If num And &H80000000 Then Exit Function
    n = num
    Do While iteraciones > 1
        snrev = StrReverse(n)
        If CStr(n) = snrev Then Exit Function
        n = n + CDbl(snrev)
        iteraciones = iteraciones - 1
    Loop
    snrev = StrReverse(n)
    If CStr(n) = snrev Then Exit Function
    EsNumLychrel4 = True
    numeroFinal = n
End Function


Por el momento es todo. Saludos.

Tokes

Aquí les dejo otra versión que según yo es más rápida.

Private Function EsNumLychrel5(ByVal num As Long, ByRef numeroFinal, Optional ByVal iteraciones As Long = 50) As Boolean
Dim n As Double, nrev As Double
    If num And &H80000000 Then Exit Function
    n = num
    Do While iteraciones > 1
        nrev = CDbl(StrReverse(n))
        If n = nrev Then Exit Function
        n = n + nrev
        iteraciones = iteraciones - 1
    Loop
    nrev = CDbl(StrReverse(n))
    If n = nrev Then Exit Function
    EsNumLychrel5 = True
    numeroFinal = n
End Function


          ¡Buen día!

Karcrack

No me da tiempo a leerme la documentacion ni nada, pero veo que estais dando la vuelta al numero usando cadenas... Esto puede que os ayude a mejorar la velocidad :)

Public Function lngReverse(ByVal lLong As Long) As Long
   Do
       lngReverse = (lngReverse * 10) + (lLong Mod 10)
       lLong = lLong \ 10
   Loop While lLong > 0
End Function


Saludos ;)

BlackZeroX


Despues de que se me trabo la inche PC reice mi codigo aqui esta!¡.

Código (Vb) [Seleccionar]


Public Function IsLychrelNumberBlackZeroX(ByVal InVal As Double, ByRef OutValEnd As Double, Optional InMaxVueltas As Long = 20) As Boolean
    If InVal And &H80000000 Then Exit Function
    OutValEnd = InVal
    Do Until OutValEnd > 9
        OutValEnd = OutValEnd + OutValEnd
        InMaxVueltas = InMaxVueltas - 1
    Loop
    Do Until InMaxVueltas < 1 'Or IsLychrelNumberBlackZeroX = True
        InVal = StrReverse(OutValEnd) + 0
        IsLychrelNumberBlackZeroX = InVal - OutValEnd = 0
        If IsLychrelNumberBlackZeroX Then Exit Do
        OutValEnd = OutValEnd + InVal
        InMaxVueltas = InMaxVueltas - 1
    Loop
    IsLychrelNumberBlackZeroX = True
End Function



Ducles Lunas!¡.
The Dark Shadow is my passion.

Psyke1

Citar
Código (vb) [Seleccionar]
InVal = StrReverse(OutValEnd) + 0
Le sumas cero por algo en particular?¿

DoEvents¡! :P

BlackZeroX

strreverse devuelve un string yo a ese string le sumo 0 para pasarlo a numero, igual como le hago en C...

aqui lo dejo corregido

Version 2.
Código (Vb) [Seleccionar]

Public Function IsLychrelNumberBlackZeroX02(ByVal InVal As Double, ByRef OutValEnd As Double, Optional InMaxVueltas As Long = 20) As Boolean
    If InVal And &H80000000 Then Exit Function
    OutValEnd = InVal
    Do Until OutValEnd > 9
        OutValEnd = OutValEnd + OutValEnd
        InMaxVueltas = InMaxVueltas - 1
    Loop
    Do Until InMaxVueltas < 1 'Or IsLychrelNumberBlackZeroX = True
        InVal = StrReverse(OutValEnd) + 0
        If InVal - OutValEnd = 0 Then Exit Do
        OutValEnd = OutValEnd + InVal
        InMaxVueltas = InMaxVueltas - 1
    Loop
    IsLychrelNumberBlackZeroX02 = True
End Function



Version 3.
Código (Vb) [Seleccionar]


Public Function IsLychrelNumberBlackZeroX03(ByVal InVal As Double, ByRef OutValEnd As Double, Optional InMaxVueltas As Long = 20) As Boolean
Dim tmp             As Double
    If InVal And &H80000000 Then Exit Function
    OutValEnd = InVal
    Do Until OutValEnd > 9
        OutValEnd = OutValEnd + OutValEnd
        InMaxVueltas = InMaxVueltas - 1
    Loop
    Do Until InMaxVueltas < 1
        tmp = OutValEnd: InVal = 0
        Do
            InVal = (InVal * 10) + (tmp Mod 10)
            tmp = tmp \ 10
        Loop While tmp > 0
        If InVal - OutValEnd = 0 Then Exit Do
        OutValEnd = OutValEnd + InVal
        InMaxVueltas = InMaxVueltas - 1
    Loop
    IsLychrelNumberBlackZeroX03 = True
End Function



Dulces Lunas!¡.
The Dark Shadow is my passion.