[RETO] Project Euler 2

Iniciado por Psyke1, 24 Enero 2013, 19:05 PM

0 Miembros y 3 Visitantes están viendo este tema.

Psyke1

Generar algoritmo que devuelva la suma de los números pares de la serie de Fibonacci menores a 4000000.

Info:
http://projecteuler.net/problem=2
http://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci


La función es correcta si devuelve:
4613732

Estructura a seguir:
Código (vb) [Seleccionar]
Private Function NOMBREFUNCION(Optional lLimit As Long = 4000000) As Long

DoEvents! :P

Danyfirex

#1
Bueno aquí dejo la mía. un Poco larga :silbar: pero funciona.  ;D


Correjido

Código (vb) [Seleccionar]
Private Function Fibonacci() As Long
Dim a As Long, b As Long, c As Long, x As Long: x = &H4
a = 0
b = 0
c = 0
a = (a * x) + 2: Fibonacci = Fibonacci + a: b = a: a = (a * x): Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a: b = a: a = (a * x) + c: Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a: b = a: a = (a * x) + c: Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a: b = a: a = (a * x) + c: Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a: b = a: a = (a * x) + c: Fibonacci = Fibonacci + a: c = a: a = (a * x) + b: Fibonacci = Fibonacci + a:
end Function



Saludos

Psyke1

Como no organices mejor el código no nos vamos a enterar de nada. :silbar: No abuses tanto de los ":".

Y te informo que haciendo esto:
Código (vb) [Seleccionar]
Dim a, b, c As Long
Sólo declaras la última variable como Long, las otras, como no has puesto nada, por defecto serían Variant, que ocupa memoria innecesariamente.
Sería así:
Código (vb) [Seleccionar]
Dim a As Long, b As Long, c As Long

DoEvents! :P

Danyfirex

#3
Cita de: Psyke1 en 24 Enero 2013, 20:49 PM
Como no organices mejor el código no nos vamos a enterar de nada. :silbar: No abuses tanto de los ":".

Y te informo que haciendo esto:
Código (vb) [Seleccionar]
Dim a, b, c As Long
Sólo declaras la última variable como Long, las otras, como no has puesto nada, por defecto serían Variant, que ocupa memoria innecesariamente.
Sería así:
Código (vb) [Seleccionar]
Dim a As Long, b As Long, c As Long

DoEvents! :P

No sabia eso.  Gracias Psyke1. y perdon por el abuso de los :.

gracias Corrijo el código.

saludos



EDITO:

Comprobé asi y me dice que es long.

Código (vb) [Seleccionar]
Private Sub Form_Load()
Dim x, y As Long
x = 4613732
MsgBox (VarType(y) = vbLong)
End Sub


Seguro que abarca los bytes de un tipo Variant?

rob1104

CitarSeguro que abarca los bytes de un tipo Variant?

Si  :)

Código (vb) [Seleccionar]
Private Sub Form_Load()
   Dim x, y As Long
   x = 4613732
   y = 4613732
   MsgBox LenB(x) & " bytes"
   MsgBox LenB(y) & " bytes"
End Sub
Sin análisis de requisitos o sin diseño, programar es el arte de crear errores en un documento de texto vacío.

Danyfirex

Cita de: rob1104 en 24 Enero 2013, 22:03 PM
Si  :)

Código (vb) [Seleccionar]
Private Sub Form_Load()
   Dim x, y As Long
   x = 4613732
   y = 4613732
   MsgBox LenB(x) & " bytes"
   MsgBox LenB(y) & " bytes"
End Sub


Gracias.

ya alargue el tema con mis preguntas y respuestas tontas  :silbar:

Edito mi código. saludos

imoen

hola

Si si no le pones tipo la declaracion automatica es variant.
Otra cosa si declarais en vez de 3 variables , un array de 3 elementos ?¿ no sale mas rentable y asi lo podeis usar en los  bucles?¿

bs imoen
Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen

rob1104

Pues bueno, como ni a mí ni a mi core 2 duo nos importa la velocidad y ademas que no tocaba vb6 desde hace mas de 2 años pues seguiré los codigos para ir practicando, no sean tan destructivos  :P

Código (vb) [Seleccionar]
Function robEuler2() As Long
   Dim f1 As Long, f2 As Long, contador As Long, resultado As Long, suma As Long
   f1 = 0
   f2 = 1
   resultado = f1 + f2
   Do While suma < 4000000
       f1 = f2 + resultado
       resultado = f2
       f2 = f1
       contador = contador + 1
       If f2 Mod 2 = 0 Then
           suma = suma + f2
       End If
   Loop
   robEuler2 = suma
End Function
Sin análisis de requisitos o sin diseño, programar es el arte de crear errores en un documento de texto vacío.

imoen

HOla

Codigo muy clarito, una pregunta , la sucesion de fibonacci tiene pares cada 4 y 3 numeros os puede ayudar eso para no tener que divir  y optimizar codigo XD

bs imoen
Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen

Psyke1

#9
Aquí dejo la mía:
Código (vb) [Seleccionar]

Private Static Function Psk1_PE2(Optional lLimit As Long = &H3D0900) As Long
Dim Q1 As Long
Dim Q2 As Long
Dim Q3 As Long
   
    If lLimit And &H80000000 Then Exit Function

   Q1 = &H1
    Q2 = &H1
    Q3 = &H2
   
   Do While Q3 < lLimit
       Psk1_PE2 = Psk1_PE2 + Q3
       
       Q1 = Q2 + Q3
       Q2 = Q1 + Q3
       Q3 = Q2 + Q1
   Loop
End Function


DoEvents! :P