elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [RETO] Comprobar si un numero dado es un numero de la suerte
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 4 5 6 Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] Comprobar si un numero dado es un numero de la suerte  (Leído 21,715 veces)
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #10 en: 12 Agosto 2010, 17:02 pm »

Me he tomado la libertad de ir testeando, aunque habria que probarlo en más PCs...
Utilizando:
cTiming.cls

Código
  1. Private tmr     As CTiming
  2.  
  3. Option Explicit
  4. Option Base 1
  5.  
  6. 'Karcrack
  7. Public Static Function IsItLucky(ByVal lNumb As Long) As Boolean
  8.    Dim bvSieve()   As Byte
  9.    Dim lJump       As Long
  10.    Dim lLastNumb   As Long
  11.    Dim i           As Long
  12.    Dim iCount      As Long
  13.    Dim xCount      As Long
  14.    Dim x           As Long
  15.  
  16.    If lNumb = 1 Or lNumb = 3 Then IsItLucky = True: Exit Function
  17.  
  18.    If (lNumb And 1 = 0) Then Exit Function
  19.  
  20.    If lJump = 0 Then lJump = 2
  21.  
  22.    If lLastNumb < lNumb Then
  23.        ReDim Preserve bvSieve(lNumb)
  24.  
  25.        iCount = 0
  26.        xCount = 1
  27.  
  28.        Do
  29.            For i = 1 To lNumb
  30.                If bvSieve(i) = False Then iCount = iCount + 1
  31.                If iCount = lJump Then
  32.                    bvSieve(i) = True
  33.                    iCount = 0
  34.                End If
  35.            Next i
  36.            iCount = 0
  37.            xCount = xCount + 1
  38.            For i = 1 To lNumb
  39.                If bvSieve(i) = False Then
  40.                    x = x + 1
  41.                    If x = xCount Then
  42.                        lJump = i
  43.                        x = 0
  44.                        Exit For
  45.                    End If
  46.                End If
  47.            Next i
  48.        Loop Until xCount > lJump
  49.    End If
  50.  
  51.    IsItLucky = Not bvSieve(lNumb)
  52.  
  53.    lLastNumb = lNumb
  54. End Function
  55.  
  56. '*PsYkE1*
  57. Public Function Check_Lucky_Number(ByVal lNumber As Long) As Boolean
  58.    Dim cTemp                   As New Collection
  59.    Dim NextElim                As Long
  60.    Dim m                       As Long
  61.    Dim x                       As Long
  62.  
  63.    If lNumber = 1 Or lNumber = 3 Then
  64.        GoTo IsLucky
  65.    ElseIf (lNumber > 1) And (lNumber Mod 2 <> 0) Then
  66.        With cTemp
  67.            For x = 1 To lNumber Step 2
  68.                .Add x
  69.            Next
  70.            NextElim = 3: m = 2
  71.            Do
  72.                x = NextElim
  73.                Do While x <= .Count
  74.                    .Remove (x)
  75.                    x = x + (NextElim - 1)
  76.                Loop
  77.                If .Item(.Count) = lNumber Then
  78.                    m = m + 1
  79.                    NextElim = .Item(m)
  80.                Else
  81.                    Exit Function
  82.                End If
  83.            Loop While Not NextElim > .Count
  84.        End With
  85. IsLucky: Check_Lucky_Number = True
  86.    End If
  87. End Function
  88.  
  89. ' LeandroA
  90. Private Function IsLuckyNumber(ByVal Num As Long) As Boolean
  91.  
  92.    Dim lCount As Long, lPos As Long
  93.    Dim c As New Collection
  94.  
  95.    If Num < 1 Then Exit Function
  96.    If Num Mod 2 = 0 Then Exit Function
  97.  
  98.    For lPos = 1 To Num Step 2
  99.        c.Add lPos
  100.    Next
  101.  
  102.    lCount = 1
  103.  
  104.    Do While c.Count > lCount
  105.  
  106.        lCount = lCount + 1
  107.        lPos = c(lCount)
  108.  
  109.        Do
  110.            If lPos > c.Count Then Exit Do
  111.            c.Remove lPos
  112.            lPos = lPos + c(lCount) - 1
  113.        Loop
  114.  
  115.        If c(c.Count) <> Num Then Exit Function
  116.    Loop
  117.  
  118.    IsLuckyNumber = True
  119.  
  120. End Function
  121.  
  122. Private Sub Form_Load()
  123.    Dim x           As Long
  124.    Dim sResult     As String
  125.  
  126.    Set tmr = New CTiming
  127.    tmr.Reset
  128.  
  129.    For x = 1 To 500
  130.        If IsLuckyNumber(x) Then ' Aqui los voy probando uno a uno... :P
  131.            sResult = sResult & x & " "
  132.        End If
  133.    Next
  134.    MsgBox tmr.sElapsed
  135.  
  136.    Debug.Print sResult
  137. End Sub


Mis resultados:

LeandroA: 28,734
Karcrack : 69,309
*PsYkE1* : 19,923


DoEvents¡! :P


En línea

ssccaann43 ©


Desconectado Desconectado

Mensajes: 792


¬¬


Ver Perfil
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #11 en: 12 Agosto 2010, 18:22 pm »

Jajajajaja...! *PsYkE1* te has vuelto un adicto al Collection...!

Excelente trabajo...! Me gustó..!


En línea

- Miguel Núñez
Todos tenemos derechos a ser estupidos, pero algunos abusan de ese privilegio...
"I like ^TiFa^"
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #12 en: 12 Agosto 2010, 23:53 pm »

Mi codigo todavia no es funcional, tiene varios fallos, por ejemplo, en la segunda llamada da errores, debido a que dejo las variables llenas de basura... a ver si consigo mañana algo de tiempo y hago la version raaaapida :P

Buen trabajo Psyke, veo que has exprimido al maximo las neuronas, a mi me dejo con dolor de cabeza :xD, tanto tiempo sin pensar... :-[ :laugh:
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #13 en: 13 Agosto 2010, 00:05 am »

Jajajajaja...! *PsYkE1* te has vuelto un adicto al Collection...!

Excelente trabajo...! Me gustó..!
Jajajajajaja  :laugh: :laugh:
Eso es por culpa de Karcrack:silbar: :xD
Él me volvió adicto... ;)
Mi codigo todavia no es funcional, tiene varios fallos, por ejemplo, en la segunda llamada da errores, debido a que dejo las variables llenas de basura... a ver si consigo mañana algo de tiempo y hago la version raaaapida :P

Buen trabajo Psyke, veo que has exprimido al maximo las neuronas, a mi me dejo con dolor de cabeza :xD, tanto tiempo sin pensar... :-[ :laugh:
Gracias¡! :D
Si te digo la verdad, en un momento me pareció tan desesperante que pense en mandarlo a la m****a... :xD
Aun asi el reto me gustó, de paso planteo una pregunta:
Esto que hemos hecho tiene alguna utilidad?¿ :huh:

DoEvents¡! :P
En línea

Dessa


Desconectado Desconectado

Mensajes: 624



Ver Perfil
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #14 en: 13 Agosto 2010, 06:10 am »

Bueno, como se dijo, no me impota el tiempo, me conformo con que funcione... espero ...porque la verdad es que me costó un huevo (el izquierdo). :xD ,  lo dicho con que funcione está bien para mí.

Código:

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Form_Load()
 
   
    Dim t1 As Long
    Dim t2 As Long
    t1 = GetTickCount
 
    Me.AutoRedraw = True
   
    Me.Print IsLucky(45235)
   
    t2 = GetTickCount
   
    Me.Print t2 - t1
   
   
   
End Sub

Function IsLucky(lngNum As Long) As Boolean

Dim x As Long, cont As Long, contStep As Long, Indice As Long, numLuck() As String
 
If lngNum < 1 Then Exit Function
If lngNum Mod 2 = 0 Then Exit Function
If lngNum = 1 Or lngNum = 3 Then IsLucky = True: Exit Function
If lngNum = 5 Then Exit Function


For x = 1 To lngNum Step 2
      ReDim Preserve numLuck(contStep)
      numLuck(contStep) = x
      contStep = contStep + 1
Next

contStep = 0: cont = 0: Indice = 1

While numLuck(Indice) <= UBound(numLuck)
  For x = 0 To UBound(numLuck)
      If cont = numLuck(Indice) - 1 Then
        cont = 0
      Else
        numLuck(contStep) = numLuck(x)
        cont = cont + 1
        contStep = contStep + 1
      End If
  Next
  If contStep = numLuck(Indice + 1) Then
    ReDim Preserve numLuck(contStep - 2)
  Else
    ReDim Preserve numLuck(contStep - 1)
  End If
  cont = 0
  contStep = 0
  Indice = Indice + 1
Wend

For x = 0 To UBound(numLuck)
 If numLuck(x) = lngNum Then
   IsLucky = True
   Exit For
 End If
Next

End Function




En línea

Adrian Desanti
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #15 en: 13 Agosto 2010, 09:50 am »

Hola Dessa!!

He mirado el code, puedes ganar un poco de velocidad si haces esto:
Código
  1. If numLuck(UBound(numLuck)) = lngNum Then IsLucky = True

En vez de esto:
Código
  1. For x = 0 To UBound(numLuck)
  2. If numLuck(x) = lngNum Then
  3.   IsLucky = True
  4.   Exit For
  5. End If
  6. Next

Teniendo en cuenta que el número que buscas siempre estara el ultimo,y te evitas recorrer tooooooodo el array, mas tarde lo miro con mas detenimiento que tengo prisa...

DoEvents¡!
:P
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #16 en: 13 Agosto 2010, 11:57 am »

Aca otra version mas rapida de la mia pero sin collection y con array. esta utiliza CopyMemory segun como esta aqui

Código
  1. Option Explicit
  2. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
  3.  
  4. Private Function IsLuckyNumber(ByVal Num As Long) As Boolean
  5.  
  6.    Dim lCount As Long, lPos As Long, i As Long
  7.    Dim Arr() As Long
  8.  
  9.    If Num < 1 Then Exit Function
  10.    If Num Mod 2 = 0 Then Exit Function
  11.  
  12.    For lPos = 1 To Num Step 2
  13.         i = i + 1
  14.         ReDim Preserve Arr(i)
  15.         Arr(i) = lPos
  16.    Next
  17.  
  18.    lCount = 1
  19.  
  20.    Do While UBound(Arr) > lCount
  21.  
  22.        lCount = lCount + 1
  23.        lPos = Arr(lCount)
  24.  
  25.        Do
  26.            If lPos > UBound(Arr) Then Exit Do
  27.            If lPos < UBound(Arr) Then CopyMemory Arr(lPos), Arr(lPos + 1), 4 * (UBound(Arr) - lPos)
  28.            ReDim Preserve Arr(UBound(Arr) - 1)
  29.            lPos = lPos + Arr(lCount) - 1
  30.        Loop
  31.  
  32.        If Arr(UBound(Arr)) <> Num Then Exit Function
  33.    Loop
  34.  
  35.    IsLuckyNumber = True
  36.  
  37. End Function
  38.  
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #17 en: 13 Agosto 2010, 12:23 pm »

a con esto es mas rapido

Código:
    ReDim Preserve Arr(CLng(Num / 2) + (Num Mod 2))
   
    For lPos = 1 To Num Step 2
         i = i + 1
         Arr(i) = lPos
    Next
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #18 en: 13 Agosto 2010, 12:44 pm »

Oops LeandroA, nuestras funciones van practicamente igual de rapido...  :o

DoEvents¡! :P
En línea

Dessa


Desconectado Desconectado

Mensajes: 624



Ver Perfil
Re: [RETO] Comprobar si un numero dado es un numero de la suerte
« Respuesta #19 en: 13 Agosto 2010, 12:57 pm »

Leandro, probando como dice Karcrack (que devuelva un Boolean ingresando un numero Long) es un "Misil", muy buena, no era que las matematicas no eran tu fuerte ?



PsYkE1, si en teoria tenes razon, pero probando no cambia en mucho, después pruebo mejor, me quedó la cabeza "quemada"  :xD








« Última modificación: 13 Agosto 2010, 13:13 pm por Dessa » En línea

Adrian Desanti
Páginas: 1 [2] 3 4 5 6 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Convertidor de número literal a número real
Programación C/C++
david_BS 0 2,410 Último mensaje 6 Mayo 2012, 21:34 pm
por david_BS
ayuda con un numero que se repita
Programación C/C++
daniel010 2 2,225 Último mensaje 13 Septiembre 2013, 03:02 am
por GenR_18
saber primer numero y ultimo numero [solucionado]
Bases de Datos
basickdagger 4 4,097 Último mensaje 3 Septiembre 2014, 17:19 pm
por basickdagger
Generar numeros que contengan un numero dado x « 1 2 »
Programación C/C++
GoBrit 13 5,184 Último mensaje 17 Enero 2015, 02:28 am
por engel lex
Invertir un número dado
Programación C/C++
BortizF 3 2,784 Último mensaje 18 Octubre 2017, 16:20 pm
por BortizF
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines