Problem Description
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 <= 100,000,000); both a and b are considered to be within the range .
INPUT FORMAT
Line 1:Two integers, a and b
SAMPLE INPUT
5 500
OUTPUT FORMAT
The list of palindromic primes in numerical order, one per line.
SAMPLE OUTPUT
5
7
11
101
131
151
181
191
313
353
373
383
MY IDEA
题目大意是打印a到b之间的回文素数,一般思路是计从a到b循环匹配满足素数与回文数的条件的数。但这样会超时。
我想到了比较快速的方法是先取回文数,而取回文数只要取半边就行。b最大是100,000,000,回文数的一半最大只要循环到10000次即可,优化了时间。
后来通过数据发现,偶数长度的回文串只有11,其他满足条件的回文素数都是奇数回文串,所以回文数的取法又简化了。
MY CODE
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int func(int n)//转换成回文数
{//如n=12时,我们只需要回文数121,
int res=n/10;
while(n)
{
res=res*10+n%10;
n/=10;
}
return res;
}
int is_prime(int n)//判断素数
{
if(n<=1){
return 0;}
if(n==2)
return 1;
int i;
int k=sqrt(n);
for(i=2;i<=k;i++)
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int a,b;
cin>>a>>b;
int i;
if(a<12){//处理偶数回文数11的情况,若a小于12,输出a在5-11之间满足条件的数
for(i=a;i<12;i++)
{
if(is_prime(i)==1)
{
cout<<i<<endl;
}
}
}
for(i=10;i<=10000;i++)
{
int x;
//先还原回文数另外一半
x=func(i);
if(x>b)
break;
if(is_prime(x)==1){
cout<<x<<endl;
}
}
return 0;
}
练习网址:http://acm.hnust.cn/JudgeOnline/problem.php?id=1144