2011-12-07 6 views
5

Aquí está el enunciado del problema:Proyecto número de Euler 37

El número 3797 tiene una propiedad interesante. Al ser primordial, es posible eliminar continuamente los dígitos de izquierda a derecha, y seguir siendo primos en cada etapa: 3797, 797, 97 y 7. De manera similar, podemos trabajar de derecha a izquierda: 3797, 379, 37 y 3.

Halla la suma de los once primos que se pueden truncar de izquierda a derecha y de derecha a izquierda.

NOTA: 2, 3, 5 y 7 no se consideran primos truncables.

Mi código me da una salida parcial. Solo 5 o 6 de los once primos requeridos se están produciendo, 3797 no siendo uno de ellos. Entonces, para encontrar el error, de forma manual (en un pedazo de papel) ejecuté el código de 3797 y de alguna manera no logro encontrar el fallo.

Creo que el error está en la segunda parte, la parte del código que verifica si el número es truncado desde la izquierda.

Código:

#include<stdio.h> 
     int isprime(int n) //Checks whether the number is prime or not 
     { 
     int i; 
     if(n==1) 
     return(0); 
     for(i=2;i<n/2+1;i++) 
     { 

      if(n%i==0) 
      { 
       return(0); 
       break; 
      } 
     } 
     return(1);  
     } 
     int main(void) 
     { 
     int count=0,z=0; 
     int i; 
     int n; 
     int x=1; 
     int reverse2=0; 
     int z1=0; 
     int p; 
     int count1=0; 
     int digit; 
     int k=1000000; 
     int reverse=0; 
     for(i=2;i<k;i++) 
     { 
      if(isprime(i)==1) 
      { 
       n=i; 
       p=i; 
       while(n>0) // This function removes the digits of the prime number from the right 
       { 
        n=n/10; 
        if(isprime(n)==1) 
        { 
         count++; 
        } 
        z++; 
       } 

       if(z==count) 
       { 
         while(p>0) //Checks whether number is left truncatable 
         { 
          digit=p%10; 
          p=p/10; 
           if(z1==0) 
           { 
            reverse=digit;//here reverse doesn't refer to reversing the number. It builds the number one digit at a time from right to left. 
           } 
           else 
           { 
            reverse=digit*x*10+reverse; 
            x++; 
           } 
           if(isprime(reverse)==1) 
           { 
            count1++; 
           } 
          z1++; 

         } 

         if(z1==count1) 
         printf("%d ",i); 

       } 
        z=0; 
        z1=0; 
        count1=0; 
        count=0; 
        reverse=0; 
        reverse2=0; 
        x=1; 
      }                                              
     } 

     } 
+1

Tengo el error, no debe ser x ++ sino x = x * 10. Lo siento :) –

+0

Tenga en cuenta que funcionará mucho más rápido si en 'isprime' considera solo aquellos' i' que satisfacen 'i * i <= n'. Debido a que '2' es el único número primo par, también puede agregar un cheque para 2 y comenzar desde' 3' en 'for', teniendo un' 2' en lugar de '1' como incremento. Supongo que será más rápido que 100 ms. –

Respuesta

3

Su cheque truncatable la izquierda está mal. Lo hice de manera diferente, más simple.

#include<stdio.h> 
int isprime(int n) //Checks whether the number is prime or not 
{ 
    int i; 
    if(n==1) 
     return(0); 
    for(i=2;i<n/2+1;i++) 
    { 

     if(n%i==0) 
     { 
      return(0); 
      break; 
     } 
    } 
    return(1);  
} 
int power(int a, int b){ 
    int r = 1; 
    int i=0; 
    for (i=0;i<b;i++){ 
     r = r * a; 
    } 
    return r; 
} 

int main(void) 
{ 
    int count=0,z=0; 
    int i; 
    int n; 
    int z1=0; 
    int p; 
    int count1=0; 
    int digits; 
    int k=1000000; 
    for(i=2;i<k;i++) 
    { 
     if(isprime(i)==1) 
     { 
      z = 0; 
      count = 0; 
      n=i; 
      p=i; 
      while(n>0) // This function removes the digits of the prime number from the right 
      { 
       n=n/10; 
       if(isprime(n)==1) 
       { 
        count++; 
       }else{ 
        count = -1; 
        break; 
       } 
       z++; 
      } 

      if(z==count) 
      { 
       z1= 0; 
       count1=0; 
       n = i; 
       p= i; 
       while(p>0) //Checks whether number is left truncatable 
       { 
        digits=n%power(10,z1+1); 
        p = p /10; 
        if (isprime(digits)==1) 
        { 
         count1++; 
        }else{ 
         count1 =-1; 
         break; 
        } 
        z1++; 
       } 

       if(z1==count1) 
        printf("%d\n ",i); 

      } 
     }                                              
    } 

} 
+0

¡Sí, gracias! Encontré el error justo después de publicar ... –

Cuestiones relacionadas