Desafío de programación
- Inicie sesión o regístrese para enviar comentarios
Hola, encontré el siguiente problema y estuve intentando resolverlo, simplemente como desafío, para aprender a programar mejor.
El problema dice:
Dar el número de enteros positivos no mayores a 1100 y que no son divisibles por ninguno de los primeros 25 números primos.
Hay un par de programas que en conjunto, si se tiene instalada la biblioteca Goferlists, sirven para encontrar números primos, los saqué de http://groups.google.com/group/comp.sys.hp48/topics">comp.sys.hp48:
1)Programa SIEVE: este programa es raro porque dentro del mismo programa tiene una llamada a sí mismo cosa que no creía que fuese posible, pero funciona.
«
IF DUP Null NOT
THEN DUP Head P
« Tail
« P MOD 0. ‹
» Filter SIEVE P SWAP +
»
END
»
En este programa los comandos Null, Head, Tail y Filter pertenecen a la biblioteca Goferlists 1.0, al igual que el comando Seq del programa de abajo.
2)Programa PRIME: este trabaja teniendo al programa anterior en la variable SIEVE
« 2 SWAP 1 Seq SIEVE »
Ejecutando 100 PRIME se obtiene una lista de todos los números primos entre 1 y 100 que son justamente los primeros 25 números primos:
{ 2 3 5 7 11 13 17 19 23 29 31
37 41 43 47 53 59 61 67 71 73 79
83 89 97 }
Hasta acá tenemos la lista de los primeros 25 números primos, pero aún falta todo lo demás!! Intenté hacerlo usando WHILE REPEAT END con algunos IF THEN ELSE adentro pero estoy perdido, les dejo lo que programé. Esto se queda ciclando como loco en el emulador y no llega a nada concreto, lo que no es extraño, ya que además de mi falta de talento natural, jamás tomé un curso de programación de nada y solo se lo que leí de los foros y manuales
« 1 LISTAP 1 0 An P PosP N
«
WHILE An 1100 ‰ @lo que no se ve bien es el símbolo menor o igual
REPEAT An P PosP GET / FP 0
==
IF
THEN An 1100 <
IF
THEN 1 'An' STO+ 1 'PosP' STO
END
ELSE PosP 25 ==
IF
THEN 1 'N' STO+ An 1100
<
IF
THEN 1 'An' STO+
END
ELSE 'PosP' 1 STO+
END
END
END N
»
»
En el código de arriba, LISTAP es una variable donde está guardada la lista de los primeros 25 números primos.
¿Alguien tiene una idea de como hacer esto?
Sin usar la biblioteca Goferlists ni los programas anteriores sería glorioso, pero aunque sea partiendo de esos programas estaría bueno que un Adicto con conocimiento lo plantee, para aprender.
Saludos.
PD: Dejo adjunto un diagrama de flujo acerca de como pense resolver esto, más allá que pensarlo y programarlo son cosas diferentes!
Actualización: para la lista de números primos se me ocurrió este que es mucho más rápido y no necesita de bibliotecas externas:
« 1. { } 0. A L S
«
WHILE S 25. <
REPEAT A ISPRIME?
IF
THEN L A + DUP 'L' STO
SIZE 'S' STO 1. 'A' STO+
ELSE 1. 'A' STO+
END
END L
»
»
- Inicie sesión o regístrese para enviar comentarios
Otros temas de interes
- como hacer una barra de menus ??
- GROBs en la hp50g ..
- Nueva Calculadora HP?? HP 39gII spécification
- ROM 2.10-7 Spreadsheet & Geometry manuales y biblioteca.
- Ayuda con Raices
- [PROYECTOS] EoEiProEngLib, MathEngProLib, EquatnEngProLib & and HP50GNKLib
- ayuda con integral exponencial
- programa tipo excell que permita introducir formulas en las tablas
- como aprender tantos comandos en SYSTEM?
Hola yo propongo:
«
1.
102. 1100.
FOR X
X ISPRIME? { 1. + } IFT
NEXT
»
- Inicie sesión o regístrese para enviar comentarios
Para la lista de primos
«
2. 2. 25.
START
DUP NEXTPRIME
NEXT 25 ->LIST
»
Para en un rato más.
- Inicie sesión o regístrese para enviar comentarios
Hola.
Dani_
Dar el número de enteros positivos no mayores a 1100 y que no son divisibles por ninguno de los primeros 25 números primos.
El minimo comun multiplo de los 25 primeros numeros primos, es divible por todos estos 25 numeros y es un numero muy grande y claro mayor que 1100.
El caso contrario de numeros no divisibles por ninguno de estos numeros
serian todos los 1100 numeros.
espero me equivoque ...
- Inicie sesión o regístrese para enviar comentarios
Hola.
al decir en el enunciado del problema
número de enteros positivos
yo entendi que no solamente serian primos.
y al decir:
no mayores a 1100
dije esto incluirá a todos los números del 1 hasta 1100.
al parecer no te entendi!!! ,mil disculpas.
- Inicie sesión o regístrese para enviar comentarios
al parecer no te entendi!!! ,mil disculpas.
Entendiste bien Yder, se trata de hallar, entre todos los números enteros positivos entre 1 y 1100 (inclusive), cuántos de ellos no son divisibles por ninguno de los primeros 25 números primos.
Sucede que Luis en su programa no contó a los no primos entre 1 y 1100, porque si los analizas te darás cuenta que todos ellos son divisibles por al menos uno de los primeros 25 números primos, y esa es la clave para resolver el problema de manera fácil y no usar un algoritmo de "fuerza bruta" como el que había planteado yo inicialmente.
- Inicie sesión o regístrese para enviar comentarios
LuisBeas cita:Hola yo propongo:
« 1. 102. 1100. FOR X X ISPRIME? { 1. + } IFT NEXT »La simpleza de este código me abruma.
La lista de los primeros 25 números primos como se vio más arriba va de 2 a 97.
Lo que haces con esto es encontrar qué cantidad de números primos hay entre 97 (sin contar al 97) y 1100. El 1 que está al principio del programa cuenta al 101 que es el primer primo después del 97, y el resto del programa se encarga de contar los primos entre 102 y 1100, dando un total de 159 números primos.Por la definición de número primo, ninguno de los primos entre 100 y 1100 será divisible por ninguno de los primeros 25 primos, es decir que ahí ya tenemos 159 números que cumplen con el enunciado del problema.
Pero ¿sería posible que un número no primo superior a 97 y menor o igual a 1100, no fuera divisible por ninguno de los primeros 25 números primos? Seguramente no. Darse cuenta de eso (que seguramente para Luis ha sido fácil pero para mí no) es la clave de resolver el problema con ese código.
Brillante tu solución, he verificado la respuesta y es correcta. Son 159 números que cumplen la condición (algunos cuentan 160 pero sabemos que el 1 no es primo).
Encontré un link donde se publican varias soluciones.
Siempre con soluciones demasiado sencillas y maravillosas, ojalá pudiera programar así, lo que a mi me lleva un día a él seguro que le lleva 10 minutos...
- Inicie sesión o regístrese para enviar comentarios
Siempre con soluciones demasiado sencillas y maravillosas, ojalá pudiera programar así, lo que a mi me lleva un día a él seguro que le lleva 10 minutos...
Es que además de mucha dedicación, ahí hay un talento natural.
Además del brillante razonamiento, me sorprendió la utilización del {1 +}, una técnica que no conocía, pero muy útil.
- Inicie sesión o regístrese para enviar comentarios














La simpleza de este código me abruma.
La lista de los primeros 25 números primos como se vio más arriba va de 2 a 97.
Lo que haces con esto es encontrar qué cantidad de números primos hay entre 97 (sin contar al 97) y 1100. El 1 que está al principio del programa cuenta al 101 que es el primer primo después del 97, y el resto del programa se encarga de contar los primos entre 102 y 1100, dando un total de 159 números primos.
Por la definición de número primo, ninguno de los primos entre 100 y 1100 será divisible por ninguno de los primeros 25 primos, es decir que ahí ya tenemos 159 números que cumplen con el enunciado del problema.
Pero ¿sería posible que un número no primo superior a 97 y menor o igual a 1100, no fuera divisible por ninguno de los primeros 25 números primos? Seguramente no. Darse cuenta de eso (que seguramente para Luis ha sido fácil pero para mí no) es la clave de resolver el problema con ese código.
Brillante tu solución, he verificado la respuesta y es correcta. Son 159 números que cumplen la condición (algunos cuentan 160 pero sabemos que el 1 no es primo).
Encontré un link donde se publican varias soluciones.
Ingeniero. Usuario de HP 50g.