Emmanuel_91
Usuario (México)
Hola, ¿qué tal? Esto es un flashback a los viejos tiempos de T! En los últimos días he estado leyendo (y tratando de aprender) programación. Me topé con un ejemplo escrito en C donde se verificaba si un número 'a' dado era primo o no. Me quedé con la intriga de generar una lista de los números primos, encontré algunos post aquí en Taringa! pero se me hicieron muy redundantes. Así, les presento el código que obtuve y que, a mi parecer, es demasiado simple. Nota: Un número primo (natural) es aquel que solamente tiene dos divisores los cuales son diferentes entre sí: la unidad 1 y el número mismo. Primos.c (Utilizaré * asteriscos para poder hacer las indentaciones, ninguno de ellos va en el código) ========================================================================= #include <stdio.h> int main(void) { **** int x, a, b; **** for (x = 2; x <= 1000; x++) { ******** a = x; ******** b = 2; ******** while (b < a) { ************ if (a % b == 0) { **************** break; ************ } ************ b += 1; ******** } ******** if (b == a) { ************ printf("%d ", a); ******** } **** } **** printf("n" ); **** return 0; } ========================================================================= En seguida una imagen del código: Ahora compilemos y ejecutemos el código: Como se puede observar, el programa devuelve los números primos comprendidos en el rango [2, 1000] Esto se debe a la instrucción de la línea 7 del código: for (x = 2; x <= 1000; x++) Si modificamos esta línea por for (x = 543; x <= 789; x++) el nuevo rango de impresión será [543, 789] Compilamos y ejecutamos: Entonces se puede modificar el código de manera que el usuario indique el rango de impresión: Compilando y ejecutando: Para imprimir 'todos' los números primos (Neverending Story) basta con modificar la línea 7 por for (x = 2; x < x + 1; x++) lo cual es un poco gracioso?, así x siempre será menor que x+1. Los datos se pueden guardar en un archivo con la función fputs (me parece) pero es lo de menos. (Ctrl + Z o Ctrl + C para detener el Cuento de Nunca Acabar) No es demasiado complicado traducir el código a Python, tienen muchas similitudes. Primos.py (De igual manera, utilizaré * asteriscos para poder hacer las indentaciones, ninguno de ellos va en el código) ============================================================================== x = 2 while x <= 1000: **** a = x **** b = 2 **** while b < a: ******** if a % b == 0: ************ break ******** b += 1 **** if b == a: ******** print a, ******** print ' ', **** x += 1 ============================================================================== Las líneas 1 y 2 del código nos indican el rango a obtener números primos: x = 2 while x <= 1000: El rango a analizar es [2, 1000] Si queremos analizar otro rango, por ejemplo [543, 789], basta modificar las primeras 2 líneas: x = 543 while x <= 789: También podemos modificar el código para que el usuario ingrese el rango a analizar: ...y al hacer esto me doy cuenta de que en los códigos de python anteriores a este último hay una línea innecesaria, o es redundante. Ocurre en la tercera línea al hacer a = x. El código correcto sería: ============================================= ============================================= x = 2 while x <= 1000: **** b = 2 **** while b < x: ******** if x % b == 0: ************ break ******** b += 1 **** if b == x: ******** print x, ******** print ' ', **** x += 1 ============================================= ============================================= Oops ¡Y también en el escrito en C! ============================================= ============================================= #include <stdio.h> int main(void) { **** int x, a, b; **** for (x = 2; x <= 10; x++) { ******** b = 2; ******** while (b < x) { ************ if (x % b == 0) { **************** break; ************ } ************ b += 1; ******** } ******** if (b == x) { ************ printf("%d ", x); ******** } **** } **** printf("n" ); **** return 0; } ============================================= ============================================= No es mucha la diferencia, de hecho ambos funcionan, pero así se va aprendiendo el proceso de eliminar sentencias innecesarias, compactar y hacer que todo corra más fluido. A esto se le llama (supongo que eso es) Optimización. Finalmente, para imprimir 'todos' los números primos basta con modificar la segunda línea de código por un valor Booleano: while True: (Ctrl + Z o Ctrl + C para detener The Neverending Story) Al ejecutar las versiones de el Cuento de Nunca Acabar (imprimir 'todos' los números primos) en los diferentes lenguajes, podrás notar que C es más rápido que Python, esto se debe a que C es un lenguaje compilado mientras Python un lenguaje interpretado. Nota: Para poder hacer uso de caracteres especiales en Python, tales como acentuación o la letra ñ, basta colocar en la primera línea de código: # -*- coding: utf-8 -*- Sin más que decir, espero que sirva de ayuda a algún estudiante o por qué no, a quienes lo hacen por 'hobbie'. Saludos. ~Emmanuel Dgz.