HOLA!!!
Bueno, un reto facil, dada la funcion:
IsFibonacciNumber(N as long) as Boolean
Se le da un numero entero sea Positivo o Negativo la funcion devolvera True si efectivamente es un numero perteneciente a la serie y false si no pertenece.
N maximo =46340
Para informacion acerca de la Secuencia de Fibonacci:
http://tinyurl.com/4ar5pd4
Obviamente vamos a usar para testear:
http://foro.elhacker.net/programacion_visual_basic/src_cfrogcontestcls_by_mr_frog_copy-t318871.0.html
XD
GRACIAS POR LEER!!!
			
			
			
				wiiiiii
siempre me gusto fibbonacci :D
che pero los numeros que nos vas a dar van de 1 a infinito? o hay algun tope?
Ya le entro :D
EDITO:
Esto puede ser muy lento, despues lo optimizo
por ahora anda bien :P
Public Function IsFibonacci(ByRef lNumber As Long) As Boolean
Dim i As Long 'anterior
Dim y As Long 'actual
Dim x As Long 'Restultado a checkear
i = 1
y = 1
    Do While x < lNumber
        x = i + y
        i = y
        y = x
        If x = lNumber Then IsFibonacci = True: Exit Function
    Loop
    IsFibonacci = False
End Function
			
			
			
				Que malos sois justo mañana tengo examen y me poneis retos! :(
No me podré resistir, asi que si no es hoy por mi noche o mañana posteo algo. ;)
Está interesante! :)
DoEvents! :P
			
			
			
				Che para mi deberia ser solo positivo, porque para ser negativo SIEMPRE hay que poner un limite para empezar. Sino no tenes cierta seguridad de si el numero pertenece a la serie o no. O sea, de 1 hacia adelante :P
			
			
			
				Bueno aqui dejo mi Funcion xD
Function isFibbonacciNum(ByVal lNumber As Long) As Boolean
    Dim Fn0 As Double
    Dim Fn1 As Double
    Dim i   As Double
    Dim Num As Double
    Fn0 = 0
    Fn1 = 1
    
    isFibbonacciNum = False
    If lNumber = 0 Or lNumber = 1 Then isFibbonacciNum = True: Exit Function
    For i = 1 To lNumber
        Num = Fn0 + Fn1
        
        Fn0 = Fn1
        Fn1 = Num
        If Num = lNumber Then isFibbonacciNum = True: Exit Function
        If Num > lNumber Then Exit Function
    Next
End Function
@Elemental Code
La funcion da error con numeros grandes ( valor long maximo  = 2.147.483.647 ) y devuelve falso para los numeros 0 y 1 cuando deberian ser true o.O
			
			
			
				Aquí dejo la mía:
Public Static Function IsFibonacciMrFrog(ByVal lngNumber As Long) As Boolean
Dim dblRaised                                       As Double
Dim dblSum                                          As Double
Dim dblSqr                                          As Double
    dblRaised = lngNumber * lngNumber
    dblSum = dblRaised + dblRaised + dblRaised + dblRaised + dblRaised + &H4
    dblSqr = Sqr(dblSum)
    IsFibonacciMrFrog = (dblSqr - CLong(dblSqr) = &H0)
    If IsFibonacciMrFrog Then Exit Function
    dblSum = dblSum - &H8
    dblSqr = Sqr(dblSum)
    IsFibonacciMrFrog = (dblSqr - CLong(dblSqr) = &H0)
End Function
Private Sub Form_Load()
Dim x           As Long
Dim s           As String
    For x = 0 To 100
        If IsFibonacciMrFrog(x) Then
            s = s & x & " "
        End If
    Next
    Debug.Print s
End Sub
Resultado:
0 1 2 3 5 8 13 21 34 55 89
DoEvents! :P
			
			
			
				para 1 la arreglo al toq.
0 no es de fibonacci :S
fibonacci se arma asi
El numero siguiente es la suma de los dos anteriores.
juraria que el 0 no iba :S
que era
1 1 2 3 5 8 13 21...
lo se porque un amigo la usaba de password y era muy facil :D
			
			
			
				Cito directo de wikipedia:
CitarEn matemáticas, la sucesión de Fibonacci es la siguiente sucesión infinita de números naturales:
    0,1,1,2,3,5,8,13,21,34,55,89,144
La sucesión inicia con 0 y 1, y a partir de ahí cada elemento es la suma de los dos anteriores.
Link: http://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci (http://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci)
			
				HOLA!!!
Igual si siguen buscando van a ver que la secuencia empieza en el -infinito si se quieren fijar.
GRACIAS POR LEER!!!
			
			
			
				Hola, creo que la forma mas rapida de todas por lo que he visto de los muhcos algoritmos que hay, es meter todos los numeros ya calculados en un array y solo buscar en el.
saludos.
			
			
			
				.
@Mr. Frogs
Tu funcion tiene Horrores de logica básica ( Conversion de un Double a un Integer ).
Aquí la mía (Aplicando algo que dijo seba123neo pero en la forma mas practica posible para el ahorro de memoria) :
Option Explicit
Function isFibbonacci(ByVal vVal&) As Boolean
Dim dbl_v#(0 To 1)
Dim byt_i                   As Byte
    If Not vVal& And &H80000000 Then
        dbl_v#(1) = 1
        dbl_v#(0) = 0
        Do Until dbl_v#(byt_i) >= vVal&
            dbl_v#(byt_i) = dbl_v#(byt_i) + dbl_v#(byt_i Xor 1)
            byt_i = byt_i Xor 1
        Loop
        If dbl_v#(0) = vVal& Or dbl_v#(1) = vVal& Then
            isFibbonacci = True
        End If
    End If
End Function
Private Sub Form_Load()
Dim lng_i&
    For lng_i& = -214748 To 2147483647
        If isFibbonacci(lng_i&) = True Then
            Debug.Print lng_i&
        End If
    Next lng_i&
End Sub
 0 
 1 
 2 
 3 
 5 
 8 
 13 
 21 
 34 
 55 
 89 
 144 
 233 
 377 
 610 
 987 
 1597 
 2584 
 4181 
 6765 
 10946 
 17711 
 28657 
 46368 
 75025 
 121393 
 196418 
 317811 
 514229 
 832040 
 1346269 
 2178309 
 3524578 
 5702887 
 9227465 
 14930352 
 24157817 
 39088169
 63245986 
 102334155 
 165580141 
 267914296 
 433494437 
 701408733 
 1134903170 
 1836311903 
P.D.: DarkMatrix tu juego aun esta Online, cual es la pagina?
Temibles Lunas!¡.
			
			
			
				HOLA!!!
Aca va mi codigo, Casi identico al de Mr Frog :S igual Lo tenia armado desde antes.
Me falta agregar la comprobacion para los negativos.
Private Function IsFibonacci7913(ByVal N As Long) As Boolean
    If N < &H0 Then
    If N = -1 Then IsFibonacci7913 = True: Exit Function
        Dim Neg0 As Double
        Dim Neg1 As Double
        Dim Neg2 As Double
        Neg0 = &H0
        Neg1 = &H1
        Do While Not (Neg1 < N)
            Neg2 = Neg0
            Neg0 = Neg1
            Neg1 = (Neg2 - Neg0)
        Loop
        If N = Neg2 Then IsFibonacci7913 = True
        Exit Function
    End If
    If N = &H0 Then IsFibonacci7913 = True: Exit Function
    Dim Aux0 As Double
    Dim Aux1 As Double
    Dim Aux2 As Double
    Aux2 = N * N
    Aux2 = Aux2 + Aux2 + Aux2 + Aux2 + Aux2
    Aux1 = Aux2 + &H4
    Aux1 = Sqr(Aux1)
    If Aux1 - (CLng(Aux1)) = &H0 Then IsFibonacci7913 = True: Exit Function
    Aux0 = Aux2 - &H4
    Aux0 = Sqr(Aux0)
    If Aux0 - (CLng(Aux0)) = &H0 Then IsFibonacci7913 = True
End Function
Nota:
1)Negafibonacci (ver fuente).
2)Comprobacion de Numeros enteros positivos sean de Fibbonacci (ver fuente).
Fuente1: http://www.worldlingo.com/ma/enwiki/es/Negafibonacci
Fuente2: http://gaussianos.com/algunas-curiosidades-sobre-los-numeros-de-fibonacci/
GRACIAS POR LEER!!!
			
			
			
				Mi función y la de 79137913 solo es valida hasta 46340... (estoy trabajando en ello) :rolleyes:
@79137913 Las varibles donde estan declaradas? :huh:
@BlackZer0xCitarTu funcion tiene Horrores de logica básica ( Conversion de un Double a un Integer ).
Creo que te equivocas, lo que hago es comprobar si el resultado es un número exacto o no, de esta manera :
Si tengo el numero 234.365 seria :
234.365 - 234 = 0 ' Falso (el número 234.365 NO es entero)Pero si es el numero 456 :
456 - 456 = 0 ' Verdadero (el número 456 es entero)DoEvents! :P
			
				HOLA!!!
Hasta ahora:
0) SOLO TESTEADO CON NUMEROS POSITIVOS
1) A MI FUNCION EN EL TEST SE LE QUITO LA PARTE DE LOS NEGATIVOS
2) ACTUALIZADO CON MI ULTIMA FUNCION
3) RESULTADOS COMPILANDO
"******TEST HECHO POR 79137913******"
**PRUEBA CON NUMEROS POSITIVOS HASTA EL MAX**
7913: 6,891 msec
BZro: 35,604 msec
E__C: 1,786 msec
Frog: 6,319 msec
Dark: 18,452 msec
Para ver el test: http://pastebin.com/LJm02bAw
GRACIAS POR LEER!!!
			
			
			
				Y yo que me iba a rendir. Ahora largo el celu y me pongo a programar
			
			
			
				Cita de: Mr. Frog © en 15 Febrero 2011, 13:48 PM
@BlackZer0xCreo que te equivocas, lo que hago es comprobar si el resultado es un número exacto o no, de esta manera :
Option Explicit
Function isFibbonacci(ByVal vVal&) As Boolean
Dim dbl_v#(0 To 1)
Dim byt_i                   As Byte
    If Not vVal& And &H80000000 Then
        dbl_v#(1) = 1
        dbl_v#(0) = 0
        Do Until dbl_v#(byt_i) >= vVal&
            dbl_v#(byt_i) = dbl_v#(byt_i) + dbl_v#(byt_i Xor 1)
            byt_i = byt_i Xor 1
        Loop
        If dbl_v#(0) = vVal& Or dbl_v#(1) = vVal& Then
            isFibbonacci = True
        End If
    End If
End Function
Private Sub Form_Load()
Dim lng_i&
    For lng_i& = -214748 To 2
        If IsFibonacciMrFrog(lng_i&) = True Then
            Debug.Print lng_i&,
        End If
        If isFibbonacci(lng_i&) = True Then
            Debug.Print lng_i&
        End If
    Next lng_i&
End Sub
Public Static Function IsFibonacciMrFrog(ByVal lngNumber As Long) As Boolean
Dim dblRaised                                       As Double
Dim dblSum                                          As Double
Dim dblSqr                                          As Double
 
    dblRaised = lngNumber * lngNumber
    dblSum = dblRaised + dblRaised + dblRaised + dblRaised + dblRaised + &H4
    dblSqr = Sqr(dblSum)
    IsFibonacciMrFrog = (dblSqr - Int(dblSqr) = &H0)
    If IsFibonacciMrFrog Then Exit Function
    dblSum = dblSum - &H8
    dblSqr = Sqr(dblSum)
    IsFibonacciMrFrog = (dblSqr - Int(dblSqr) = &H0)
End Function
Creer no es bueno:
Usa 
clng() en lugar de 
int(), ( en vb6: 
int = 2 bytes, Double = 8 bytes, long = 4 bytes. ¿cual crees que abarca una cantidad mayor? )
los numeros superan a 
int().
Estos valores los calcule del 
0 al 2147483647 (MAXIMO Numero en Long))
 0 
 1 
 2 
 3 
 5 
 8 
 13 
 21 
 34 
 55 
 89 
 144 
 233 
 377 
 610 
 987 
 1597 
 2584 
 4181 
 6765 
 10946 
 17711 
 28657 
 46368 
 75025 
 121393 
 196418 
 317811 
 514229 
 832040 
 1346269 
 2178309 
 3524578 
 5702887 
 9227465 
 14930352 
 24157817 
 39088169
 63245986 
 102334155 
 165580141 
 267914296 
 433494437 
 701408733 
 1134903170 
 1836311903 
Dulces lunas!¡.
			
 
			
			
				HOLA!!!
Black tiene razon, no me habia dado cuenta :P
GRACIAS POR LEER!!!
			
			
			
				@Black
Oops... Lo peor de todo es que sé los bytes correspondientes a cada variable. :¬¬
No se porque pensaba que Int() era direfente de CInt() ... En fin, cosas mías, gracias por la corrección. ;)
DoEvents! :P
			
			
			
				colgandome de lo que dijeron de cual era el limite se me ocurrio hacer trampa  :silbar:
Public Function FibonacciChecker_eCode(ByRef lNumero As Long) As Boolean
Dim FiSplit() As String
Dim i As Long
Const Fi As String = "0,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368"
FiSplit() = Split(Fi, ",", -1, vbBinaryCompare)
For i = 0 To 23
    If lNumero = CLng(FiSplit(i)) Then FibonacciChecker_eCode = True: Exit Function
    If lNumero < CLng(FiSplit(i)) Then FibonacciChecker_eCode = False: Exit Function
Next i
End Function
ahora reviso el codigo que no le tenia fe y resulto ser el mas rapido :P
Edito :D
Aca dejo optimizado el codigo que use antes, ahora reconoce el 0 y el 1
Public Function IsFibonacci_eCode(ByRef lNumber As Long) As Boolean
Dim i As Long 'anterior
Dim y As Long 'actual
Dim x As Long 'Restultado a checkear
y = 1
    Do While x < lNumber
        If x = lNumber Then IsFibonacci_eCode = True: Exit Function
        x = i + y
        i = y
        y = x
    Loop
    IsFibonacci_eCode = False
End Function
Estoy maserando otro codigo, paciencia que ya voy ;)
Wiiiii :D
Gracias a MrFrog que me dijo que use el do-loop para armar esto :D
Public Function IsFibonacci_eCodeMatrix(ByRef lNumero As Long) As Boolean
    Dim f() As Long
    Dim i As Long
    ReDim f(1)
    f(0) = 0
    f(1) = 1
    i = 2
    Do
        Debug.Print i; ","; f(i - 1)
        If lNumero = f(i - 1) Then IsFibonacci_eCode = True:  Exit Function
        If lNumero < f(i - 1) Then IsFibonacci_eCode = False:  Exit Function
        ReDim Preserve f(i)
        f(i) = f(i - 1) + f(i - 2)
        i = i + 1
    Loop
End Function
Tres codes para un reto. toy demasiado al pedo  :)
			
			
			
				.
Se vale hacer trampa? mmm, pues bueno aqui estan TODOS los numeros Fibonacci hasta el numero Máximo de Long.
Public Function IsFibonacci_WithCache(ByRef vVal As Long) As Boolean
Dim lng_i          As Long
Dim var_cache()
    var_cache() = Array(0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903)
    For lng_i = 0 To UBound(var_cache)
        If var_cache(lng_i) = vVal Then IsFibonacci_WithCache = True: Exit For
    Next lng_i
End Function
Temibles Lunas!¡.
			
			
			
				Ook, con trampa creo que gano... :rolleyes:
Private Const sF As String = " 0 1 2 35 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 "
Public Static Function IsFibonacci_WithCache_MrFrog(ByRef lngNum As Long) As Boolean
    IsFibonacci_WithCache_MrFrog = InStrB(1, sF, " " & lngNum & " ")
End Function
DoEvents! :P
			
			
			
				Private Const sF As String = "0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903"
 
Public Static Function IsFibonacci_WithCache_MrFrog(ByRef lngNum As Long) As Boolean
    IsFibonacci_WithCache_MrFrog = InStr(1, sF, lngNum, vbBinaryCompare)
End Function
private sub Form_load()
   msgbox isfibonacci_withcache_mrfrog(4)  '<------ True!!!!!
end sub
Private Const sF As String = " 0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 "
Function isfibonacciIgno(IngNum As Long) As Boolean
    isfibonacciIgno = InStr(sF, " " & IngNum & " ")
End Function
 ;)
			
			
			
				Ya está corregida. :)
Test:
Option Explicit
Private Const sF As String = " 0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 "
 
Function isfibonacciIgno(IngNum As Long) As Boolean
    isfibonacciIgno = InStr(sF, " " & IngNum & " ")
End Function
Public Static Function IsFibonacci_WithCache_MrFrog(ByRef lngNum As Long) As Boolean
    IsFibonacci_WithCache_MrFrog = InStrB(1, sF, " " & lngNum & " ")
End Function
Public Function IsFibonacci_WithCache(ByRef vVal As Long) As Boolean
Dim lng_i          As Long
Dim var_cache()
    var_cache() = Array(0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903)
    For lng_i = 0 To UBound(var_cache)
        If var_cache(lng_i) = vVal Then IsFibonacci_WithCache = True: Exit For
    Next lng_i
End Function
Public Function FibonacciChecker_eCode(ByRef lNumero As Long) As Boolean
Dim FiSplit() As String
Dim i As Long
Const Fi As String = "0,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368"
FiSplit() = Split(Fi, ",", -1, vbBinaryCompare)
 
For i = 0 To 23
    If lNumero = CLng(FiSplit(i)) Then FibonacciChecker_eCode = True: Exit Function
    If lNumero < CLng(FiSplit(i)) Then FibonacciChecker_eCode = False: Exit Function
Next i
End Function
Private Sub Form_Load()
If App.LogMode = 0 Then End 'Compile it, stupid!
Dim t As New CTiming
Dim x As Long
    AutoRedraw = True
    
    t.Reset
    For x = 0 To 100000
        IsFibonacci_WithCache_MrFrog x
    Next
    Me.Print "MrFrog", , t.sElapsed
    
    t.Reset
    For x = 0 To 100000
        isfibonacciIgno x
    Next
    Me.Print "ignorantev1.1", , t.sElapsed
    
    t.Reset
    For x = 0 To 100000
        IsFibonacci_WithCache x
    Next
    Me.Print "BlackZer0x", , t.sElapsed
    
    t.Reset
    For x = 0 To 100000
        FibonacciChecker_eCode x
    Next
    Me.Print "Elemental Code", t.sElapsed
End Sub
Resultado:
(http://img401.imageshack.us/img401/3766/nuevaimagendemapadebitswv.png)
DoEvents! :P
			
			
			
				
rivate Const sF As String = "0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903"
Public Static Function IsFibonacci_WithCache_MrFrog(ByRef lngNum As Long) As Boolean
    IsFibonacci_WithCache_MrFrog = InStr(1, sF, (" " & lngNum & " "), vbBinaryCompare)
End Function
private sub form_load()
    msgbox IsFibonacci_WithCache_MrFrog(0) <------ FALSE!!!
    msgbox IsFibonacci_WithCache_MrFrog(1836311903) <------ FALSE!!!
end sub
 :xD no me hagas caso  :¬¬
			
			
			
				rana, pone los otros codigos tambien.
No solamente los que buscan en arrays.
Manejando arrays soy un queso.
			
			
			
				Cita de: Elemental Code en 16 Febrero 2011, 03:46 AM
rana, pone los otros codigos tambien.
No solamente los que buscan en arrays.
Manejando arrays soy un queso.
¿Ya está puestos en la pág anterior no? :huh:
@ignorantev1.1Dios, soy un desastre, al llamar tu constante igual que la mía, al copiarlo para el test, copié la mía en vez de la tuya... :¬¬
PD: Tabla de resultados actualizada! :D
DoEvents! :P
			
 
			
			
				HOLA!!!
Creo que ya terminamos :P :
TABLA POSITIVOS Y NEGATIVOS
"******TEST HECHO POR 79137913******"
**PRUEBA CON NUMEROS +/- HASTA EL MAX**
7913: 26,316 msec
BZro: 49,330 msec
Comprobacion de numeros de Fibonacci Positivos:
Ganador    Elemental Code
2do Puesto Mr Frog
3er Puesto 79137913
Comprobacion de numeros de Fibonacci Positivos (trampa):
Ganador    Mr Frog
2do Puesto Ignorante v1.1
3er Puesto BlackZeroX[escala de grises :P]
Comprobacion de numeros de Fibonacci Enteros (+/-):
Ganador 79137913
2do Puesto BlackZeroX[/escala de grises :P]
GRACIAS POR LEER!!!
			
			
			
				Cita de: 79137913 en 16 Febrero 2011, 12:05 PM
HOLA!!!
Creo que ya terminamos...
Comprobacion de numeros de Fibonacci Enteros (+/-):
Unico Participante 79137913
No me gusto eso ya que mi funcion soporta numeros negativos (los compruevo en bits).
Dulces Lunas!¡.
			
 
			
			
				HOLA!!!
@BlackZeroX▓▓▒▒░░ : Sorry no me habia dado cuenta :P.
Ya modifique las cosas
Cita de: 79137913 en 16 Febrero 2011, 12:05 PM
HOLA!!!
Creo que ya terminamos :P :
TABLA POSITIVOS Y NEGATIVOS
"******TEST HECHO POR 79137913******"
**PRUEBA CON NUMEROS +/- HASTA EL MAX**
7913: 26,316 msec
BZro: 49,330 msec
Comprobacion de numeros de Fibonacci Positivos:
Ganador    Elemental Code
2do Puesto Mr Frog
3er Puesto 79137913
Comprobacion de numeros de Fibonacci Positivos (trampa):
Ganador    Mr Frog
2do Puesto Ignorante v1.1
3er Puesto BlackZeroX[escala de grises :P]
Comprobacion de numeros de Fibonacci Enteros (+/-):
Ganador 79137913
2do Puesto BlackZeroX[/escala de grises :P]
GRACIAS POR LEER!!!
GRACIAS POR LEER!!!