Solución a la Tarea 4: Primos gemelos
Una recomendación para resolver esta tarea es la de primero
definir una función que decida si un número es primo o
no. De las muchas formas de hacer esto, abajo mostramos una que es
más o menos rápida, pues sólo revisa posibles
divisores hasta la raíz cuadrada de la entrada. No olvide que
ningún número menor que 2 es primo. Una vez leída
m, lo primero que hace el programa de abajo es calcular el menor impar
que vale al menos m. ¿Porqué funciona m = 2*(m/2) + 1?
Observe que ninguno de dos primos gemelos puede ser par
¿porqué? Finalmente, buscamos el primer valor de m para
el cual tanto m como m+2 son primos. Si m no satisface esta
condición la incrementamos en 2 ¿porqué?
#include <stdio.h>
int primo(long p)
{
long i;
if (p < 2)
return 0;
for (i = 2; i*i <= p; i++)
if (p % i == 0)
return 0;
return 1;
}
int main(void)
{
long m;
scanf("%ld", &m);
m = 2*(m/2)+1;
while (!(primo(m) && primo(m+2)))
m += 2;
printf("%ld %ld\n", m, m+2);
return 0;
}
Los valores de entrada y salida empleados para la evaluación
fueron los siguientes:
Entrada Salida
1 3 5
10 11 13
12 17 19
21 29 31
123 137 139
321 347 349
1234 1277 1279
4321 4337 4339
12345 12377 12379
54321 54401 54403
Para probar su tarea en UNIX, escriban la instrucción gcc -lm prigemNN.c -o prigem
para
compilar su programa, y la instrucción ./prigem para correrlo.
Algunos errores comúnes fueron: (a) Olvidarse de que el 1 no es
primo e incluso no considerar que su programa se bloquearía con
esa entrada, (b) Olvidarse de probar por todos los divisores posibles,
y no sólamente por 2, 3 y 5, (c) No verificar que los dos
números de la salida deben ser primos.
Además, les recuerdo que
sólo deben enviar el archivo .c y que éste debe tener el
nombre correcto.