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!!!