2013-04-16 3 views
0

Я написал код, чтобы получить первые 1000 простых палиндромов, хотя моя логика правильная, я, кажется, не получаю первые 1000 простых палиндромов, я получаю 113 первичных палиндромов, и после этого я не получаю Любые . Я думаю, это связано с тем, что моя логика недостаточно эффективна, поэтому для компиляции требуется столько времени, но я уже пробовал три разных метода и каждый раз, когда Runtime застревает после 113-го номера Prime Palindrome.Эффективность логики Prime Palindrome

Может кто-нибудь объяснить, почему именно я получаю эту проблему, потому что код не эффективен?

/* Program to find the first 1000 prime palindromes */ 

#include<stdio.h> 
#include<math.h> 


int prime(long int n) 
{ 
    int i,check=0; 

    if(n!=2 && n%2==0) 
     return 0; 

    if(n==2 || n==3) 
     return 1; 

    for(i=3;i<n/2;i=i+2) 
     if(n%i==0) 
     check++; 

    if(check==0) 
     return 1; 
    else 
    return 0; 
} 

/*long int reverse_number(long int n,long int partial) 
{ 
if(n==0) 
    return partial; 
else 
    return reverse_number(n/10,partial*10 + n%10); 
}*/ 

int palindrome(long int n) 
{ 
    long int reverse = 0; 
    long int n_copy = n; 
    int rem; 
    while(n_copy!=0) 
    { 
    rem = n_copy%10; 
    reverse = reverse*10; 
    reverse = reverse + rem; 
    n_copy = n_copy/10; 
    } 

    if(reverse==n) 
    return 1; 
    else 
    return 0; 

} 


int main() 
{ 
    long int i; 
    int count=5,digits; 


    printf("The 1000 prime palindromes are: \n"); 
    printf("1. 2\n2. 3\n3. 5\n4. 7\n"); 

    for(i=11;;i=i+2) 
    { 
     if(prime(i)) 
     { 
      if(palindrome(i)) 
      { 
       printf("%d. %ld\n",count,i); 
       count++; 
      } 
      /*if(reverse_number(i,0)==i) 
      { 
      printf("%d. %ld\n",count,i); 
      count++; 

      }*/ 

     } 
     if(count==50) 
      break; 
    } 



    printf("\n\n"); 

    return 0; 

}

+0

Не имея возможности посмотреть, что такое размер этих чисел, но я бы сказал, что у вас есть ошибка переполнения. Записанный длинный int, как правило, 32 бит в C, поэтому вы можете перейти до 2^31-1, или ~ 2 миллиарда. Все, что больше, будет переполняться, и может вызвать непредвиденные проблемы. – Greg

+1

i <= √n, check ++ и break – BLUEPIXY

+0

@Greg Нет переполнения здесь, простые палиндромы не так редки. Это было и мое первое подозрение. –

ответ

4

Процитирую мой императивный профессор программирования здесь: «Вы можете проверить, является ли число простым и палиндром, или проверить, является ли она палиндромом и премьер ...»

Кроме того, вы break ИНГ петлю, когда count 50, который я предполагаю, что вы хотите сделать, когда это 1000.

Без редактирования prime и palindrome функции, кроме того, в КН Их вызывают, мой компьютер перестает находить больше после 781 9989899.

+0

Вот и ответ. Также было бы целесообразно создавать палиндромы напрямую (цикл от 1 до n и для каждого числа, отменить его и склеить половинки вместе, а затем повторить с удалением средней цифры), и в тесте первичности можно выйти из цикла, когда найден фактор. – jjrv

+1

Он не останавливается, он просто замедляется. Следующий первичный палиндром - 100030001, и поскольку основным тестом является Theta (p) для простого 'p', это занимает довольно много времени. –

+0

Ах да, это действительно не остановилось, оно на самом деле все еще работает. (: – Kninnug