Prime Palindromes(回文素数)

来源:互联网 发布:支付宝mac 编辑:程序博客网 时间:2024/04/28 23:18

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

                                             
2 0
原创粉丝点击