题目英文描述:
The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 1000,000,000); both a and b are considered to be within the range .
InputLine 1: Two integers, a and b
OutputThe list of palindromic primes in numerical order, one per line.
sample input :
5 500
sample output:
5
7
11
101
131
151
181
191
313
353
373
383
刚开始的思路:
就是想着写个素数判定函数、回数判定函数,同时满足条件即可~可是提交上去,没有AC,而是显示超时了。
#include <stdio.h>
#include <math.h>
int Prime(int n)
{
int i;
double k;
k=sqrt(n);
for(i=2;i<=k;i++)
{
if (n%i==0)
{
return 0;
}
}
return 1;
}
int Palindromes(int num)
{
int sum = 0;
//关键代码
int temp = num;
while(temp)
{
sum = sum*10 + temp%10;
temp /= 10;
}
if (sum == num)
return 1;
else
return 0;
}
int main()
{
int num1= 0 ,num2 = 0;
while(scanf("%d %d",&num1,&num2)!=EOF)
{
int i = num1;
for(;i<=num2;i++)
{
if(Palindromes(i))
{
if(Prime(i))
printf("%d\n",i);
}
}
}
return 0;
}
之后在网上找资料,才发现,可以利用回数的规律对回数的判定进行优化的。以下是基于回数判定的优化~已经AC;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Prime(int n)
{
int i;
double k;
k=sqrt(n);
for(i=2;i<=k;i++)
{
if (n%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int a,b,c,d,e,f,g,y;
scanf("%d %d",&f,&g);
for (a=5;a<=7;a++)
{
if (Prime(a)==1&&a>=f&&a<=g)
{
printf("%d\n",a);
}
}
for (a=1;a<=9;a+=2)
{
y=11*a;
if(Prime(y)==1&&y>=f&&y<=g)
printf("%d\n",y);
}
for (a=1;a<=9;a+=2)
{
for(b=0;b<=9;b++)
{
y=a*101+10*b;
if(Prime(y)==1&&y>=f&&y<=g)
printf("%d\n",y);
}
}
for (a=1;a<=9;a+=2)
{
for(b=0;b<=9;b++)
{
for (c=0;c<=9;c++)
{
y=10001*a+1010*b+100*c;
if (Prime(y)==1&&y>=f&&y<=g)
printf("%d\n",y);
}
}
}
for (a=1;a<=9;a+=2)
{
for (b=0;b<=9;b++)
{
for (c=0;c<=9;c++)
{
for (d=0;d<=9;d++)
{
y=1000001*a+100010*b+10100*c+1000*d;
if (Prime(y)==1&&y>=f&&y<=g)
printf("%d\n",y);
}
}
}
}
for (a=1;a<=9;a+=2)
{
for (b=0;b<=9;b++)
{
for (c=0;c<=9;c++)
{
for (d=0;d<=9;d++)
{
for (e=0;e<=9;e++)
{
y=100000001*a+10000010*b+1000100*c+101000*d+10000*e;
if (Prime(y)==1&&y>=f&&y<=g)
printf("%d\n",y);
}
}
}
}
}
return 0;
}