Я написал код, чтобы получить первые 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;
}
Не имея возможности посмотреть, что такое размер этих чисел, но я бы сказал, что у вас есть ошибка переполнения. Записанный длинный int, как правило, 32 бит в C, поэтому вы можете перейти до 2^31-1, или ~ 2 миллиарда. Все, что больше, будет переполняться, и может вызвать непредвиденные проблемы. – Greg
i <= √n, check ++ и break – BLUEPIXY
@Greg Нет переполнения здесь, простые палиндромы не так редки. Это было и мое первое подозрение. –