2011-12-07 11 views
5

Oto zestawienie problemu:Projekt Euler numer 37

Numer 3797 ma interesującą właściwość. Będąc samą siłą podstawową, możliwe jest ciągłe usuwanie cyfr od lewej do prawej i pozostawanie pierwszymi na każdym etapie: 3797, 797, 97 i 7. Podobnie możemy pracować od prawej do lewej: 3797, 379, 37 i 3.

Znajdź sumę tylko jedenastu liczb pierwszych, które są obcinane z lewej do prawej iz prawej do lewej.

UWAGA: 2, 3, 5 i 7 nie są uważane za wstępujące do startu.

Mój kod daje mi częściowe wyjście. Wykonuje się tylko 5 lub 6 z jedenastu wymaganych liczb pierwszych, przy czym 3797 nie jest jednym z nich. Aby znaleźć błąd, ręcznie (na kawałku papieru) uruchomiłem kod dla 3797 i jakoś nie udało mi się znaleźć usterki.

Myślę, że błąd znajduje się w drugiej części, czyli części kodu, która sprawdza, czy liczba jest skracana z lewej strony.

Kod:

#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

Wystąpił błąd, nie powinien to być x ++, ale x = x * 10. Przepraszam :) –

+0

Zauważ, że zadziała znacznie szybciej, jeśli w 'isprime' bierzesz pod uwagę tylko' i', które spełniają 'i * i <= n'. Ponieważ '2' jest jedyną parzystą liczbą pierwszą, możesz również dodać sprawdzenie dla 2 i zacząć od' 3' w 'for', mając' 2' zamiast '1' jako inkrement. Przypuszczam, że będzie to szybciej niż 100 ms. –

Odpowiedz

3

lewą check truncatable jest źle. Zrobiłem to inaczej, prostsze.

#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

Tak, dziękuję! Znalazłem błąd w nim zaraz po opublikowaniu ... –

Powiązane problemy