Autor
|
Tema: [RETO] Project Euler 1 (Leído 21,681 veces)
|
Psyke1
Wiki
Desconectado
Mensajes: 1.089
|
¿Qué os parece si hacemos todos los retos de Proyect Euler ? Después se podría poner una chincheta con todos los ejercicios guardados. ¿Empezamos por el 1? http://projecteuler.net/problem=1 DoEvents!
|
|
« Última modificación: 3 Febrero 2013, 16:21 pm por Psyke1 »
|
En línea
|
|
|
|
Danyfirex
Desconectado
Mensajes: 493
My Dear Mizuho
|
me parece excelente. Aqui tienes a un participante. Por cierto pésimo en matemáticas. jajajaja EDITO: segun el problema dice esto. If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.según lo que se 10 es divisible entre 5. entonces la suma seria 33. o no ? EDITO. 1 Si esta bien no leí la palabra below. saludos EDITO: 2 Aquí esta el mio. Private Sub Form_Load() Dim resultado As Long Dim i As Integer Dim d1, d2 As Boolean For i = 1 To 999 d1 = CBool((i / 3) = Int(i / 3)) d2 = CBool((i / 5) = Int(i / 5)) If d1 Or d2 Then resultado = resultado + i End If Next i MsgBox (resultado) End Sub
Como Funcion para un Numero dado. Function mul_3_5(Numero As Long) As Long Dim resultado As Long Dim i As Integer Dim d1, d2 As Boolean For i = 1 To Numero d1 = CBool((i / 3) = Int(i / 3)) d2 = CBool((i / 5) = Int(i / 5)) If d1 Or d2 Then resultado = resultado + i End If Next i mul_3_5 = (resultado) End Function
saludos
|
|
« Última modificación: 23 Enero 2013, 14:09 pm por Danyfirex »
|
En línea
|
|
|
|
79137913
Desconectado
Mensajes: 1.169
4 Esquinas
|
HOLA!!! Dany, yo que vos busco sobre optimizacion de codigo. Private Function mul5and3below1000() As Long Dim ct As Long Dim aux As Long Do mul5and3below1000 = mul5and3below1000 + aux + aux2 ct = ct + 1 aux = ct + ct + ct aux2 = ct + ct + ct + ct + ct Loop While aux2 < 1000 Do mul5and3below1000 = mul5and3below1000 + aux ct = ct + 1 aux = ct + ct + ct Loop While aux < 1000 ct = 0 aux = 0 Do mul5and3below1000 = mul5and3below1000 - aux ct = ct + 1 aux = ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct Loop While aux < 1000 End Function
GRACIAS POR LEER!!!
|
|
« Última modificación: 23 Enero 2013, 17:10 pm por 79137913 »
|
En línea
|
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!" "La peor de las ignorancias es no saber corregirlas"
79137913 *Shadow Scouts Team*
|
|
|
Danyfirex
Desconectado
Mensajes: 493
My Dear Mizuho
|
HOLA!!! Dany, yo que vos busco sobre optimizacion de codigo.
gracias por el Consejo. Codigo optimizado: Function mul_3_5() As Long Dim i As Integer For i = 1 To 999 If (i Mod 3) < 1 Or (i Mod 5) < 1 Then mul_3_5 = mul_3_5 + i End If Next i End Function
Saludos
|
|
|
En línea
|
|
|
|
79137913
Desconectado
Mensajes: 1.169
4 Esquinas
|
HOLA!!!
Bueno, mejoraste el largo del codigo y un poco la velocidad esta bien, pero mira el mio y tu codigo.
Podras observar que en mi codigo funciona haciendo sumas de los casos positivos dentro de el campo muestral (1-999) y quitando al final las superposiciones mientras que el tuyo lo que hace es analizar una por una todas las probabilidades y extraer de ellas las que cumplen las condiciones. la cantidad de vueltas del primer bucle es de 200 , el segundo 133 y el tercero 66, dando un total de 399 vueltas muchas menos que en tu codigo de 999.
En definitiva tu codigo hace prueba y error, el mio une los 2 grupos de multiplos y quita los repetidos.
P.d: Eso que hago de ct + ct + ct es lo mismo que ct *3 pero es mas rapido para que lo tengas en cuenta.
GRACIAS POR LEER!!!
|
|
|
En línea
|
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!" "La peor de las ignorancias es no saber corregirlas"
79137913 *Shadow Scouts Team*
|
|
|
$Edu$
Desconectado
Mensajes: 1.842
|
Me instalaria el visual basic especialmente para esos retos xD Pero podrias traducirlos y plantear el ejercicio como haces siempre Psyke? asi nadie se confunde traduciendo y terminamos haciendo todos cosas distintas jaja, y ademas de que esta bueno cuando pones como queres la funcion y ejemplos de valores que retornara.
|
|
|
En línea
|
|
|
|
Danyfirex
Desconectado
Mensajes: 493
My Dear Mizuho
|
HOLA!!!
Bueno, mejoraste el largo del codigo y un poco la velocidad esta bien, pero mira el mio y tu codigo.
Podras observar que en mi codigo funciona haciendo sumas de los casos positivos dentro de el campo muestral (1-999) y quitando al final las superposiciones mientras que el tuyo lo que hace es analizar una por una todas las probabilidades y extraer de ellas las que cumplen las condiciones. la cantidad de vueltas del primer bucle es de 200 , el segundo 133 y el tercero 66, dando un total de 399 vueltas muchas menos que en tu codigo de 999.
En definitiva tu codigo hace prueba y error, el mio une los 2 grupos de multiplos y quita los repetidos.
P.d: Eso que hago de ct + ct + ct es lo mismo que ct *3 pero es mas rapido para que lo tengas en cuenta.
GRACIAS POR LEER!!!
Claro pero si te fijas en tu código haciendo tantas sumas pierdes velocidad. si te fijas en el tiempo aun mi función con 999 repeticiones es un 30% o 40% mas rápida que la tuya. Edito: un 20% o 10%
|
|
« Última modificación: 23 Enero 2013, 16:59 pm por Danyfirex »
|
En línea
|
|
|
|
79137913
Desconectado
Mensajes: 1.169
4 Esquinas
|
HOLA!!!
Eso que me decis me deja atonito...
Hice los testeos y los acabe de realizar nuevamente, tu funcion es aprox 100% mas lenta que la mia ( y siendo generoso 100%), proba con este ejemplo que arme para medir el timing, acordate que se testea compilado.
(borre el codigo por que lo hizo E_C abajo.
GRACIAS POR LEER!!!
|
|
« Última modificación: 23 Enero 2013, 17:32 pm por 79137913 »
|
En línea
|
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!" "La peor de las ignorancias es no saber corregirlas"
79137913 *Shadow Scouts Team*
|
|
|
Elemental Code
Desconectado
Mensajes: 622
Im beyond the system
|
Private Sub Form_Load() Form1.Show Form1.AutoRedraw = True MsgBox "empezara luego del ok" t = Timer For x = 0 To 100000 Call mul5and3below1000 Next Form1.Print "tiempo 7913 " & Timer - t Form1.Print "resultado 7913 " & mul5and3below1000 t = Timer For x = 0 To 100000 Call mul_3_5 Next Form1.Print "Tiempo dany " & Timer - t Form1.Print "Resultado dani " & mul_3_5 End Sub Private Function mul5and3below1000() As Long Dim ct As Long Dim aux As Long Do mul5and3below1000 = mul5and3below1000 + aux + aux2 ct = ct + 1 aux = ct + ct + ct aux2 = ct + ct + ct + ct + ct Loop While aux2 < 1000 Do mul5and3below1000 = mul5and3below1000 + aux ct = ct + 1 aux = ct + ct + ct Loop While aux < 1000 ct = 0 aux = 0 Do mul5and3below1000 = mul5and3below1000 - aux ct = ct + 1 aux = ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct Loop While aux < 1000 End Function Function mul_3_5() As Long Dim i As Integer For i = 1 To 999 If (i Mod 3) < 1 Or (i Mod 5) < 1 Then mul_3_5 = mul_3_5 + i End If Next i End Function
Ok, con esta funcion de testeo los resultados mios son:
|
|
|
En línea
|
I CODE FOR $$$ Programo por $$$ Hago tareas, trabajos para la facultad, lo que sea en VB6.0 Mis programas
|
|
|
Danyfirex
Desconectado
Mensajes: 493
My Dear Mizuho
|
HOLA!!!
Eso que me decis me deja atonito...
Hice los testeos y los acabe de realizar nuevamente, tu funcion es aprox 100% mas lenta que la mia ( y siendo generoso 100%), proba con este ejemplo que arme para medir el timing, acordate que se testea compilado.
(borre el codigo por que lo hizo E_C abajo.
GRACIAS POR LEER!!!
Estabas en lo cierto. bueno no un 100 pero si mucho mas. la comprobé así. Dim ct As New CTiming Private Sub Form_Load() Form1.Show MsgBox "empezara luego del ok" ct.Reset For x = 1 To 10000 Call mul5and3below1000 Next Form1.Print "Tiempo 7913 -->" & ct.sElapsed Form1.Print "Resultado 7913 -->" & mul5and3below1000() ct.Reset For x = 1 To 10000 Call mul_3_5 Next Form1.Print "Tiempo dany -->" & ct.sElapsed Form1.Print "Resultado dany -->" & mul_3_5() End Sub Private Function mul5and3below1000() As Long Dim ct As Long Dim aux As Long Do mul5and3below1000 = mul5and3below1000 + aux + aux2 ct = ct + 1 aux = ct + ct + ct aux2 = ct + ct + ct + ct + ct Loop While aux2 < 1000 Do mul5and3below1000 = mul5and3below1000 + aux ct = ct + 1 aux = ct + ct + ct Loop While aux < 1000 ct = 0 aux = 0 Do mul5and3below1000 = mul5and3below1000 - aux ct = ct + 1 aux = ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct Loop While aux < 1000 End Function Function mul_3_5() As Long Dim i As Integer For i = 1 To 999 If (i Mod 3) < 1 Or (i Mod 5) < 1 Then mul_3_5 = mul_3_5 + i End If Next i End Function
gracias vere si la puedo mejorar. saludos
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Projecto Euler problema 12
Ejercicios
|
lDanny
|
5
|
5,436
|
16 Octubre 2010, 04:33 am
por [L]ord [R]NA
|
|
|
[RETO] Project Euler 2
« 1 2 3 »
Programación Visual Basic
|
Psyke1
|
23
|
10,960
|
25 Enero 2013, 23:19 pm
por Danyfirex
|
|
|
[RETO] Project Euler 3
« 1 2 »
Programación Visual Basic
|
Psyke1
|
13
|
6,976
|
3 Febrero 2013, 20:45 pm
por imoen
|
|
|
[RETO] Project Euler 4
« 1 2 »
Programación Visual Basic
|
Psyke1
|
10
|
6,109
|
4 Febrero 2013, 23:32 pm
por imoen
|
|
|
Ayuda con el calculo de Pi por la Serie de Euler
Programación C/C++
|
Rollingman216
|
3
|
2,203
|
24 Agosto 2017, 04:09 am
por engel lex
|
|