2011-12-07 19 views
5

İşte sorun bildirimi:Proje Euler numarası 37

3797 sayısı ilginç bir özelliğe sahiptir. Asal olarak, rakamları soldan sağa doğru sürekli olarak kaldırmak mümkündür ve her aşamada asaldır: 3797, 797, 97 ve 7. Benzer şekilde sağdan sola doğru çalışabiliriz: 3797, 379, 37 ve 3.

Hem soldan sağa hem de sağdan sola doğru her iki trinstable olan yalnızca on bir öncü toplamı bulun.

NOT: 2, 3, 5 ve 7, çizilemez primler olarak kabul edilmez.

Kodum bana kısmi bir çıktı veriyor. On bir zorunlu primerin sadece 5 veya 6'sı çıkmaktadır, 3797 bunlardan biri değildir. Hatayı bulmak için, elle (bir kağıda) 3797 kodunu çalıştırdım ve bir şekilde aksaklığı bulamıyor.

Sanırım, hata ikinci kısımda, kodun soldan sağa doğru kalıplanabilir olup olmadığını kontrol eden kısmı.

Kodu:

#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

Hata oluştu, x ++ olmamalı, x = x * 10 olmalıdır. Özür dilerim :) –

+0

Eğer isprime'de sadece i 'i' i * i <= n' yerine getirdiğini düşünürseniz çok daha hızlı çalışacağına dikkat edin. '2' sadece bir numaralı asal sayı olduğu için, 2 için bir kontrol ekleyebilir ve '3''den' ''' başlayarak, '1' yerine artım olarak' 2'ye sahip olabilirsiniz. Sanırım 100 ms'den daha hızlı olacak. –

cevap

3

Kişisel sol truncatable onay yanlıştır. Bunu daha farklı yaptım, daha basit.

#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

Yea teşekkürler! Sadece gönderildikten sonra hatayı buldum ... –

İlgili konular