2011-12-07 31 views
5

Đây là tuyên bố vấn đề:Số dự án Euler 37

Số 3797 có một thuộc tính thú vị. Là nguyên tố chính nó, có thể liên tục loại bỏ các chữ số từ trái sang phải, và vẫn giữ nguyên ở mỗi giai đoạn: 3797, 797, 97 và 7. Tương tự chúng ta có thể làm việc từ phải sang trái: 3797, 379, 37 và 3.

Tìm tổng của mười một số nguyên tố chỉ có thể cắt từ trái sang phải và phải sang trái.

LƯU Ý: 2, 3, 5 và 7 không được coi là số nguyên tố cắt ngắn.

Mã của tôi cung cấp cho tôi một phần đầu ra. Chỉ có 5 hoặc 6 trong số mười một số nguyên tố bắt buộc được xuất ra, 3797 không phải là một trong số đó. Vì vậy, để tìm lỗi, tôi bằng tay (trên một mảnh giấy) chạy mã cho 3797 và bằng cách nào đó không thể quản lý để tìm thấy trục trặc.

Tôi nghĩ rằng lỗi ở phần thứ hai, phần mã kiểm tra xem con số có cắt xén từ bên trái hay không.

Code:

#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

Có lỗi, không được x ++ nhưng x = x * 10. Xin lỗi :) –

+0

Lưu ý rằng nó sẽ hoạt động nhanh hơn nhiều nếu trong 'isprime' bạn chỉ xem xét những' i' thỏa mãn 'i * i <= n'. Vì '2' là số nguyên tố duy nhất, bạn cũng có thể thêm một dấu kiểm cho 2 và bắt đầu từ' 3' trong 'for', có' 2' thay vì '1' làm tăng. Tôi cho rằng nó sẽ nhanh hơn 100 ms. –

Trả lời

3

séc truncatable trái của bạn là sai. Tôi đã làm nó khác đi, đơn giản hơn.

#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

Cảm ơn bạn! Tôi đã tìm thấy lỗi trong nó ngay sau khi tôi đăng ... –

Các vấn đề liên quan