Solución a la Tarea 4: Primos escondido

En la solución que muestro abajo tengo tres funciones. La primera (hecha en clase) sólo nos dice si un número es primo o no. La segunda va quitándole dígitos a n por la derecha (dividiendo entre 10) y a cada paso decidiendo si el número resultante es primo o no. La tercera primero calcula una potencia de 10 adecuada y luego va quitándole dígitos a n por la izquierda (haciendo módulo dicha potencia) y a cada paso decidiendo si el número resultante es primo o no. La función principal simplemente llama a esas tres funciones para hacer el trabajo.

#include <stdio.h>
 
int esprimo(int n)
{
  int i;
 
  if (n < 2)
    return 0;
  for (i=2; i*i <= n; i++)
    if (n%i == 0)
      return 0;
  return 1;
}
 
int derecha(int n)
{
  int d = 0;
 
  for (n = n/10; n > 0; n = n/10)
    if (esprimo(n))
      d++;
  return d;
}
 
int izquierda(int n)
{
  int i = 0, p;
 
  if (n == 0)
    return 0;
  for (p = 1; p <= n; p = 10*p);
  p = p/10;
  for (n = n%p; p >= 10; p = p/10, n = n%p)
    if (esprimo(n))
      i++;
  return i;
}
 
int main(void)
{
  int n;
 
  scanf("%d", &n);
  printf("%d %d %d\n", esprimo(n), derecha(n), izquierda(n));
  return 0;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

Entrada     Salida
211         1 1 1
0           0 0 0
918273645   0 0 1
1           0 0 0
2           1 0 0
23          1 1 1
4321        0 1 0
31415       0 2 1
314159      1 2 3
1111111     0 1 1


Para probar su tarea en UNIX, escriban la instrucción gcc pesconNN.c -o pescon para compilar su programa, y la instrucción ./pescon para correrlo. Algunos errores comúnes fueron: (a) Contabilizar el número original N en las dos cuentas D e I. (b) No eliminar uno por uno los dígitos del lado derecho. (c) No eliminar uno por uno los dígitos del lado izquierdo. (d) No detectar correctamente el caso especial N = 0.