Solución a la Tarea 4: Sucesiones de primos
Hay al menos cuatro formas de resolver esta tarea. Una de ellas era
hacer dos ciclos: uno para la N desde el valor A hasta el valor B y el
otro para la D desde el valor 1 hasta un valor tal que N+2D
todavía sea menor o igual a B. El segundo ciclo se
debería ejecutar sólo si N es primo y dentro de este
ciclo se debería revisar si N+D y N+2D son primos. La segunda
forma de resolver la tarea consiste en hacer tres ciclos: uno para P,
otro para Q y un tercero para R, revisando en cada caso si P, Q y R son
primos y están en sucesión aritmética. Sin embargo
esta solución resulta en un programa demasiado ineficiente
(aunque correcto). La tercera forma consiste en sólo hacer dos
ciclos: uno para P y otro para Q. El tercer ciclo ya no es necesario
porque la R que queda en sucesión aritmética se puede
calcular como R = Q + (Q-P) = 2Q - P (no olvidemos que se debe revisar
que R <= B). Abajo muestro una cuarta forma similar a la tercera:
#include <stdio.h>
int primo(int n)
{
int i;
if (n < 2)
return 0;
if (n == 2)
return 1;
if (n % 2 == 0)
return 0;
for (i = 3; i*i <= n; i += 2)
if (n % i == 0)
return 0;
return 1;
}
int main(void)
{
int a, b, p, q, r, s = 0;
scanf("%d%d", &a, &b);
for (p = a; p < b; p++)
if (primo(p))
for (q = p+1, r = p+2; r <= b; q++, r
+= 2)
if (primo(q) &&
primo(r))
s++;
printf("%d\n", s);
}
Los valores de entrada y salida empleados para la evaluación
fueron los siguientes:
Entrada Salida
1
1 0
2 34 11
3 45 16
4 56 14
5 67 19
6 78 20
7 89 29
8 91 25
9 101 29
10 111 38
Para probar su tarea en UNIX, escriban la instrucción gcc sucpriNN.c -o sucpri para
compilar su programa, y la instrucción ./sucpri para correrlo.
Algunos errores comúnes fueron: (a) No revisar bien si un
número es primo o no. (b) No revisar que P, Q y R deben ser
primos. (c) No revisar que P, Q y R estén en el intervalo de la
A a la B. (d) No revisar que P, Q y R estén en sucesión
aritmética. (e) No revisar que P < Q < R, es decir,
algunos contaron el caso cuando P = Q = R, pero esto implica que D = 0.