2011-12-07 9 views
5

ここに問題文があります:プロジェクトオイラーの数37

3797という数字は興味深い性質があります。プライムそれ自体では、左から右に連続して数字を削除し、各段階でプライムを維持することができます:3797,779,97、および7同様に、右から左:3797,379,37および3で作業できます。

左から右に、右から左に切り捨てられる11個の素数の合計を求めます。

注:2,3,5、および7は切り捨て可能な素数ではないとみなされます。

私のコードは、私に部分的な出力を与えます。必要な11個の素数のうち5個または6個だけが出力され、3797個はそれらの1個ではない。だから、エラーを見つけるために、私は手作業で(紙面に)3797のコードを実行し、何とかしてグリッチを見つけることができませんでした。

エラーは2番目の部分にあります。数字が左側から切り捨てられるかどうかを確認するコードの部分です。

コード:

#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'が唯一の素数であるので、2のチェックを追加し、' for'の '3'から始まり、' 1'の代わりに '2'をインクリメントとして使用することもできます。私はそれが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

よろしくお願いします!私は投稿した直後にそのエラーを見つけました... –

関連する問題