2011-12-07 14 views
5

यहां समस्या कथन है:परियोजना यूलर संख्या 37

संख्या 3797 में एक दिलचस्प संपत्ति है। प्राइम होने के नाते, लगातार बाएं से दाएं अंकों को हटा देना संभव है, और प्रत्येक चरण में प्रमुख रहें: 37 9 7, 7 9 7, 9 7, और 7. इसी प्रकार हम दाएं से बाएं: 37 9 7, 37 9, 37, और 3 में काम कर सकते हैं।

केवल ग्यारह प्राइम का योग खोजें जो बाएं से दाएं और दाएं से बाएं दोनों में ट्यून करने योग्य हैं।

नोट: 2, 3, 5, और 7 को ट्रंककटेबल प्राइम नहीं माना जाता है।

मेरा कोड मुझे आंशिक आउटपुट देता है। ग्यारह आवश्यक प्राइम्स के केवल 5 या 6 का उत्पादन किया जा रहा है, 37 9 7 उनमें से एक नहीं है। तो त्रुटि खोजने के लिए, मैन्युअल रूप से (कागज के एक टुकड़े पर) 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 * i <= n' को संतुष्ट करते हैं तो यह बहुत तेज़ काम करेगा। चूंकि '2' केवल एकमात्र प्रमुख संख्या है, इसलिए आप 2 के लिए चेक भी जोड़ सकते हैं और '1'' से' 3' से शुरू कर सकते हैं, जिसमें '1' की बजाय वृद्धि के रूप में' 2' होना चाहिए। मुझे लगता है कि यह 100 एमएस से तेज होगा। –

उत्तर

3

आपका छोड़ दिया truncatable जांच गलत है। मैंने इसे अलग, सरल किया।

#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

हाँ धन्यवाद! मैंने पोस्ट करने के बाद ही इसमें त्रुटि पाई ... –

संबंधित मुद्दे