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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  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 es Oblongo/Pronico
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 2 3 [4] 5 Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] Comprobar si un numero es Oblongo/Pronico  (Leído 26,606 veces)
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #30 en: 17 Agosto 2010, 20:30 pm »

Para extremistas!¡.

QueryPerformanceCounter

Edito:

Proyecto gral!¡. 

Dulces Lunas!¡.


« Última modificación: 17 Agosto 2010, 20:35 pm por BlackZeroX » En línea

The Dark Shadow is my passion.
cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #31 en: 17 Agosto 2010, 20:35 pm »

No me dejen afuera!!!!! no tengo mucho tiempo ahora pero quiero darle una probada.


En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Tokes

Desconectado Desconectado

Mensajes: 140


Ver Perfil
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #32 en: 17 Agosto 2010, 20:45 pm »

Oye BlackZerox:

Gracias por el proyecto general. Te voy a molestar con una pregunta:

El módulo que contiene las funciones del timer, si yo no lo tuviera, ¿Tengo que crearlo, o ya hay una librería o algo así?

       Por tu atención, gracias.
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #33 en: 17 Agosto 2010, 20:48 pm »

lmax = Sqr(lNumb) = al numero

carajo cuando lo probe no me daba poreso restaba uno y ahora veo que si funciona.  :-\

me gusto esta (nval And &H80000000) para los negativos.

En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #34 en: 17 Agosto 2010, 21:10 pm »

Para quien le interese la funcion Sqr en ASM (es el punto critico ahora)

http://www.azillionmonkeys.com/qed/sqroot.html

@Tokes

en el mismo .Zip esta el archivo CTiming.cls, ya esta el proyecto completo!¡.

Dulces Lunas!¡.
« Última modificación: 17 Agosto 2010, 21:12 pm por BlackZeroX » En línea

The Dark Shadow is my passion.
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #35 en: 17 Agosto 2010, 21:13 pm »

No jodas, yo hice ese mismo código que ha colgado Tokes (salvo que omití el valor OR) y no lo puse porque el de Karcrack era bastante más rápido, supongo que eso me pasa por no tener el VB6 y probarlo en VBA :¬¬

Que alguien busque otro "reto" de estos, que a la próxima no me quedo quieto >:D

Saludos
« Última modificación: 17 Agosto 2010, 21:25 pm por Novlucker » En línea

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
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #36 en: 17 Agosto 2010, 21:56 pm »

[OffTopic]
estuve queriendo probar las diferencias de velocidades entre el IF, SELECT CASE, IF inline etc.
la cuestion es que vi que las funciones que se llaman primero tiene cierta ventaja con respecto a las otras, esto mismo pasa cuando queremos comparar las funciones que estamos haciendo. Es correcto esto que digo?¿?¿

esto es lo que hice
si alteran el orden de las llamadas hay ciertos cambios.

Código
  1. Option Explicit
  2.  
  3. Private CTiming As CTiming
  4.  
  5.  
  6. Private Sub Form_Load()
  7.    Dim i As Long, j As Long
  8.    Dim ValTest As Long
  9.  
  10.    Set CTiming = New CTiming
  11.  
  12.    Me.AutoRedraw = True
  13.  
  14.    Me.Print "Test de velocidad" & vbCrLf
  15.  
  16.    ValTest = 5000000
  17.  
  18.    CTiming.Reset
  19.  
  20.    For i = 0 To ValTest
  21.        For j = 1 To 4
  22.            Prueba1 j
  23.        Next
  24.    Next
  25.  
  26.    Me.Print "Prueba1 " & CTiming.sElapsed
  27.  
  28.    CTiming.Reset
  29.  
  30.    For i = 0 To ValTest
  31.        For j = 1 To 4
  32.            Prueba2 j
  33.        Next
  34.    Next
  35.  
  36.    Me.Print "Prueba2 " & CTiming.sElapsed
  37.  
  38.    CTiming.Reset
  39.  
  40.    For i = 0 To ValTest
  41.        For j = 1 To 4
  42.            Prueba3 j
  43.        Next
  44.    Next
  45.  
  46.    Me.Print "Prueba3 " & CTiming.sElapsed
  47.  
  48.    CTiming.Reset
  49.  
  50.    For i = 0 To ValTest
  51.        For j = 1 To 4
  52.            Prueba4 j
  53.        Next
  54.    Next
  55.  
  56.    Me.Print "Prueba4 " & CTiming.sElapsed
  57.  
  58.    CTiming.Reset
  59.  
  60.    For i = 0 To ValTest
  61.        For j = 1 To 4
  62.            Prueba5 j
  63.        Next
  64.    Next
  65.  
  66.    Me.Print "Prueba5 " & CTiming.sElapsed
  67.  
  68.    CTiming.Reset
  69.  
  70.    For i = 0 To ValTest
  71.        For j = 1 To 4
  72.            Prueba6 j
  73.        Next
  74.    Next
  75.  
  76.    Me.Print "Prueba6 " & CTiming.sElapsed
  77.  
  78.    CTiming.Reset
  79.  
  80.    For i = 0 To ValTest
  81.        For j = 1 To 4
  82.            Prueba7 j
  83.        Next
  84.    Next
  85.  
  86.    Me.Print "Prueba7 " & CTiming.sElapsed
  87.  
  88. End Sub
  89.  
  90.  
  91.  
  92. Private Function Prueba1(ByVal num As Long) As Long
  93.    Select Case num
  94.        Case 1
  95.            Prueba1 = 1
  96.        Case 2
  97.            Prueba1 = 2
  98.        Case 3
  99.            Prueba1 = 3
  100.        Case Else
  101.            Prueba1 = -1
  102.    End Select
  103. End Function
  104.  
  105.  
  106. Private Function Prueba2(ByVal num As Long) As Long
  107.    If num = 1 Then Prueba2 = 1 Else If num = 2 Then Prueba2 = 2 Else If num = 3 Then Prueba2 = 3 Else Prueba2 = -1
  108. End Function
  109.  
  110.  
  111. Private Function Prueba3(ByVal num As Long) As Long
  112.  
  113.    If num = 1 Then
  114.        Prueba3 = 1
  115.        Exit Function
  116.    End If
  117.  
  118.    If num = 2 Then
  119.        Prueba3 = 2
  120.        Exit Function
  121.    End If
  122.  
  123.    If num = 3 Then
  124.        Prueba3 = 3
  125.        Exit Function
  126.    End If
  127.  
  128.    Prueba3 = -1
  129.  
  130. End Function
  131.  
  132. Private Function Prueba4(ByVal num As Long) As Long
  133.  
  134.    If num = 1 Then
  135.        Prueba4 = 1
  136.    Else
  137.        If num = 2 Then
  138.            Prueba4 = 2
  139.        Else
  140.            If num = 3 Then
  141.                Prueba4 = 3
  142.            Else
  143.                Prueba4 = -1
  144.            End If
  145.        End If
  146.    End If
  147.  
  148. End Function
  149.  
  150. Private Function Prueba5(ByVal num As Long) As Long
  151.  
  152.    If num = 1 Then
  153.            Prueba5 = 1
  154.        ElseIf num = 2 Then
  155.                Prueba5 = 2
  156.            ElseIf num = 3 Then
  157.                    Prueba5 = 3
  158.                Else
  159.                    Prueba5 = -1
  160.                End If
  161.  
  162.  
  163. End Function
  164.  
  165.  
  166. Private Function Prueba6(ByVal num As Long) As Long
  167.    Prueba6 = IIf(num = 1, 1, IIf(num = 2, 2, IIf(num = 3, 3, -1)))
  168. End Function
  169.  
  170. Private Function Prueba7(ByVal num As Long) As Long
  171.    If num = 1 Then Prueba7 = 1: Exit Function
  172.    If num = 2 Then Prueba7 = 2: Exit Function
  173.    If num = 3 Then Prueba7 = 3: Exit Function
  174.    Prueba7 = -1
  175. End Function
  176.  
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #37 en: 17 Agosto 2010, 21:57 pm »

Veaaamos:

Código:
n*(n+1) = numero_oblongo
numero_oblongo = n² + n
n² + n - numero_oblongo = 0
n = (-1 +- Raiz(1+4*numero_oblongo))/(2)


Esta no seria la forma mas rapida, pero es la unica que comprendo...
Código:
Private Function IsOblongoAlgebra(ByVal nVal As Long, ByRef n As Long) As Boolean
    If (nVal And 1) Or (nVal And &H80000000) Then Exit Function

    n = (Sqr(1 + nVal * 4) - 1) / 2
    
    IsOblongoAlgebra = (n * n + n = nVal)
End Function

No veo en que punto n = sqr(nVal) a partir de la ecuacion...


Si quereis saber mas sobre VB6 rapido visitar esta pagina :)
Código:
http://www.xbeat.net/vbspeed/
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #38 en: 17 Agosto 2010, 22:03 pm »

[OffTopic]
estuve queriendo probar las diferencias de velocidades entre el IF, SELECT CASE, IF inline etc.
la cuestion es que vi que las funciones que se llaman primero tiene cierta ventaja con respecto a las otras, esto mismo pasa cuando queremos comparar las funciones que estamos haciendo. Es correcto esto que digo?¿?¿

Sabes que yo estaba sospechando lo mismo? :P Cambio el orden de las llamadas, espero un buen rato (2 min :xD) sin ejecutar nada y vuelvo a hacer las pruebas y ...... cambian los resultados (aunque se mantiene una "pequeña" proporcion) :P

Aun asi, no es "para tanto". Lo que me parece raro, es que yo copie la funcion de tokes, le cambie de nombre a las variables.... y? .... 2ms mas lento :¬¬ no se si sera mi cpu o que...
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Comprobar si un numero es Oblongo/Pronico
« Respuesta #39 en: 17 Agosto 2010, 23:23 pm »

He aqui mi obra maestra: (ACTUALIZADO) :P
Código:
'---------------------------------------------------------------------------------------
' Module    : cIsOblongo
' Author    : Karcrack
' Now       : 17/08/2010 22:59
' Purpose   : Fastest way to know if a number is Pronic
' History   : 17/08/2010 First cut .....................................................
'             18/08/2010 Fixed and skip odd numbers ....................................
' + Info    : http://foro.elhacker.net/programacion_visual_basic/reto_comprobar_si_un_numero_es_oblongopronico-t302373.0.html
'---------------------------------------------------------------------------------------

Option Explicit
Option Base 0

'NTDLL
Private Declare Sub RtlMoveMemory Lib "NTDLL" (Destination As Any, Source As Any, ByVal Length As Long)

Private c_Code(9)       As Currency

Public Function IsOblongo(ByVal lNumb As Long, ByRef n As Long) As Boolean
    ' Will be filled with ASM code later
End Function

Private Sub Class_Initialize()
    Dim i               As Long
    Dim p               As Long

    For i = 0 To 8
        c_Code(i) = CCur(Choose(i + 1, _
                        501112136803166.0373@, 341985116955243.3932@, _
                        -95471687302877.8613@, -837664576038867.3265@, _
                        -452778894006412.4835@, -402254135688842.0366@, _
                        -857247319500392.0127@, 353164454255135.2835@, _
                        -441078304330420.0512@, -802975918502654.77@))
    Next i

    Call RtlMoveMemory(p, ByVal ObjPtr(Me), 4)
    Call RtlMoveMemory(ByVal p + &H1C, VarPtr(c_Code(0)), 4)
End Sub
Codigo ASM utilizado:
Código:
http://karcrack.pastebin.com/MUkSE1qs

Resultados de velocidad (i = 0 to 10000):
Código:
~2msec


Saludos ::)
« Última modificación: 18 Agosto 2010, 02:11 am por Karcrack » En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DUDA] Comprobar si un número es ondulado
Programación C/C++
Kropt32 2 7,643 Último mensaje 15 Diciembre 2010, 09:04 am
por Kropt32
[JSTL] Como comprobar si una variable es un numero en JSTL
Desarrollo Web
nhaalclkiemr 0 4,623 Último mensaje 10 Abril 2011, 20:42 pm
por nhaalclkiemr
[RETO] Determinar Número Perfecto « 1 2 3 »
Programación Visual Basic
Miseryk 20 9,161 Último mensaje 8 Noviembre 2013, 02:24 am
por rob1104
comprobar numero repetido en un vector
Programación C/C++
MessageBoxA 4 3,342 Último mensaje 26 Junio 2014, 02:05 am
por MeCraniDOS
¿Es posible escapar del reto “vecinos de número”?
Noticias
wolfbcn 6 1,817 Último mensaje 13 Agosto 2019, 18:42 pm
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines