// suma de los once primos truncables #include <stdio.h> #include <math.h> long long long long long long long priTru(long); priTruIzq(long); priTruDer(long); primo(long); quiDigIzq(long); potencia(long, long); numDig(long); int main() { // suma los once primos truncables, como 3997 long s = 0, n = 10, t = 0; while (t < 11) { if (priTru(n)) { t++; s += n; } n++; } printf("%ld", s); return 0; } long priTru(long n) { // si n es primo truncable long p = 0; if (priTruIzq(n) && priTruDer(n)) p = 1; return p; } long priTruIzq(long n) { // si primo truncable izquierda long p = primo(n); while (p && n) { n = quiDigIzq(n); if (n) p = primo(n); } return p; } long priTruDer(long n) { // si primo truncable izquierda long p = primo(n); while (p && n) { n /= 10; if (n) p = primo(n); } return p; } long primo(long n) { // si n es primo long p = 1, d = 2; // primo, divisor if (n < 2) p = 0; else while (p && d <= sqrt(n)) if (!(n%d++)) p = 0; return p; } long quiDigIzq(long n) { // quita digito de la izquierda a n n = n%(potencia(10, numDig(n)-1)); return n; } long potencia(long b, long e) { // b a la e long p = 1; // potencia while (e--) p *= b; return p; } long numDig(long n) { // numero de digitos de n long d = 1; while (n > 9) { n /= 10; d++; } return d; } // ecabrera, sdqdr, marzo 2015