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.