2011-12-07 39 views
5

問題說明如下:歐拉項目號碼:37

數字3797有一個有趣的屬性。作爲素數本身,可以從左到右連續刪除數字,並在每個階段保持素數:3797,797,97和7.同樣,我們可以從右到左工作:3797,379,37和3。

查找從左到右和從右到左都可截斷的只有十一個素數的總和。

注:2,3,5和7不被視爲可截斷的素數。

我的代碼給了我一個部分輸出。輸出11個所需質數中只有5個或6個,其中3797個不是其中之一。所以爲了找到錯誤,我手動(在一張紙上)運行3797的代碼,並以某種方式無法找到毛刺。

我認爲錯誤發生在第二部分,它檢查數字是否從左邊截斷。

代碼:

#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

得到了錯誤,它不應該是x ++,而是x = x * 10。對不起:) –

+0

請注意,如果在'isprime'中你只考慮那些滿足'i * i <= n'的'i',它將工作得更快。因爲'2'是唯一的素數,所以你可以在'for'的'3'開始添加一個2的支票,以'2'代替'1'作爲增量。我想它會比100毫秒更快。 –

回答

3

你離開截去檢查是錯誤的。我做了不同的,更簡單的。

#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

謝謝!我在發佈之後發現了錯誤... –