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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Ejercicios
| | | |-+  Projecto Euler problema 12
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Projecto Euler problema 12  (Leído 5,436 veces)
lDanny

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Projecto Euler problema 12
« en: 7 Octubre 2010, 12:51 pm »

Hola, bueno estoy comenzando en python y vi estos problemas que tienen en Projecto Euler, la verdad que etsan muy bien, bueno el problema 12 que es este

Citar
La secuencia de los numeros del triangulo se genera mediante la adicion de los numeros naturales.
Asi que el 7mo numero triangulo seria 1+2+3+4+5+6+7=28.Los 10 primeros terminos serian:
                         1, 3, 6, 10, 15, 21, 28, 36, 45, 55,.....
Vamos a enumerar los factores de los números triangulo siete primeros:
1:    1
3 :   1, 3
6 :   1, 2, 3 ,6
10 : 1, 2, 5, 10
15 : 1, 3, 5, 15
21 : 1, 3, 7, 21
28 : 1, 2, 4, 7, 14 ,28

Podemos ver que el 28 es el numero primer triangulo de tener mas de cinco divisores.
¿Cual es el valor del numero de primer triangulo de tener mas de 500 divisores?
 
El codigo lo tengo pero no es optimo demora mucho de hecho todavía no me sale cual es el numero con mas de  500 divisores, pero me sale el de 400  ;-)
Es por eso que les digo si pueden resolverlo y que termine en un tiempo aceptable (el mio mas de 30 minutos y no lo resuelve xD) a poder ser en python, aunque pueden ponerlo en cualquier lenguaje.
Gracias.


En línea

lDanny

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Projecto Euler problema 12
« Respuesta #1 en: 7 Octubre 2010, 12:53 pm »

Bueno para que se animen pongo mi codigo, recien empiezo en pyhton asi que si ven algo que podria hacerse mejor, quitar lineas de codigo que sobran me avisan.

Código
  1. def divisores(n):
  2. cont=0
  3. L=[]
  4. div=2
  5. turno=-1
  6. while (n>1):
  7. if (n%div==0):
  8. L.append([div,cont])
  9. turno+=1
  10. while True:
  11. if (n%div==0):
  12. n=n/div
  13. cont=cont+1
  14. L[turno][1]=cont
  15. else:
  16. break
  17. cont=0
  18. div+=1
  19. total=1
  20. for i in range(len(L)):
  21. total=total*(L[i][1]+1)
  22. return total
  23. cont=0
  24. adicional=1;
  25. div=0
  26. while True:
  27. cont = cont +adicional
  28. adicional+=1
  29. div = divisores(cont)
  30. if (div == 501):
  31. break
  32. print cont,'  ',div
  33.  
  34.  


En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Projecto Euler problema 12
« Respuesta #2 en: 7 Octubre 2010, 14:01 pm »

Buenas

Tengo esto ...
Código
  1. import math
  2. cant = input('Ingrese cantidad de divisores: ')
  3. def divisible(n):
  4.    count = 0
  5.    for i in range(1,int(math.sqrt(n))+1):
  6.        if n%i == 0:
  7.            count += 2
  8.    return count
  9.  
  10. temp = 1
  11. suma = 0
  12. while True:
  13.    suma += temp
  14.    temp += 1
  15.    if divisible(suma) > cant:
  16.        print(suma)
  17.        break

En el ejercicio no pide que se impriman los divisores por lo cual no lo agrego, de modo de ahorrarme unos pocos recursos :P
Cronometrando en un Core2Duo E7500 2.93ghz lleva unos 5,2 segundos de media para encontrar el de los 501 divisores :P

Saludos

Saludos
« Última modificación: 7 Octubre 2010, 14:26 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
lDanny

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Projecto Euler problema 12
« Respuesta #3 en: 7 Octubre 2010, 16:15 pm »

Novlucker  gracias por responder, pero creo que mi codigo es mas rapido xDDDDDD(suerte de principiante jejeje).
En mi ordenador el tuyo lo hace en en 33s y el mio en 21s jejeje.
Bueno mi error era que yo no ponia como condicion de parada que fuera mayor a 500 divisores, lo que hacia era que parara cuando exista un numero con 501 divisores exactos  :-[, bueno cambiado esto va bien y lo hace en 21s, pero supongo que se podra hacer mas rapido.
Puedo seguir poniendo en este post ejercicios del projecto euler?.
Gracias
Aqui el code para que lo comprueben.
Código
  1. def divisores(n):
  2. cont=0
  3. L=[]
  4. div=2
  5. turno=-1
  6. while (n>1):
  7. if (n%div==0):
  8. L.append([div,cont])
  9. turno+=1
  10. while True:
  11. if (n%div==0):
  12. n=n/div
  13. cont=cont+1
  14. L[turno][1]=cont
  15. else:
  16. break
  17. cont=0
  18. div+=1
  19. total=1
  20. for i in range(len(L)):
  21. total=total*(L[i][1]+1)
  22. return total
  23.  
  24. cont=0
  25. adicional=1;
  26. div=0
  27. while True:
  28. cont = (adicional*(adicional+1))/2
  29. adicional+=1
  30. div = divisores(cont)
  31. if (div > 500):
  32. break
  33. print cont,'  ',div
  34.  
  35.  
En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Projecto Euler problema 12
« Respuesta #4 en: 7 Octubre 2010, 16:23 pm »

Jaja :xD, es que de hecho no me moleste en intentar hacerlo más rápido, simplemente vi que ponías que tu code demoraba media hora, así que cuando vi que este eran 5 segundos no miré más, no tenía tanto tiempo como para quemarme la cabeza con el algoritmo :xD

Excelente entonces si ahora quedo bien :D

Saludos

« Última modificación: 7 Octubre 2010, 16:46 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
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Projecto Euler problema 12
« Respuesta #5 en: 16 Octubre 2010, 04:33 am »

Yo tengo uno con el cual participe en ese mismo problema:

Código
  1. b=1
  2. a=1
  3. while(1):
  4.    b+=1
  5.    a+=b
  6.    c=0
  7.    for i in range(1,a+1):
  8.        if a%i==0:c+=1
  9.    if c>500:break
  10. print a
  11.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[RETO] Project Euler 1 « 1 2 3 4 5 »
Programación Visual Basic
Psyke1 42 21,674 Último mensaje 26 Enero 2013, 11:20 am
por imoen
[RETO] Project Euler 2 « 1 2 3 »
Programación Visual Basic
Psyke1 23 10,958 Último mensaje 25 Enero 2013, 23:19 pm
por Danyfirex
[RETO] Project Euler 4 « 1 2 »
Programación Visual Basic
Psyke1 10 6,107 Último mensaje 4 Febrero 2013, 23:32 pm
por imoen
Java Netsbeans 6.9 projecto ayuda!! :(
Java
Juanmcv 0 1,584 Último mensaje 1 Junio 2013, 02:41 am
por Juanmcv
Ayuda con el calculo de Pi por la Serie de Euler
Programación C/C++
Rollingman216 3 2,202 Último mensaje 24 Agosto 2017, 04:09 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines