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.