回文素数Prime Palindromes

                                            4190. Prime Palindromes
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

There are multiple test cases.

Each case contains two integers, a and b.

a=b=0 indicates the end of input.

Output

For each test case, output the list of palindromic primes in numerical order, one per line.

 

Sample Input
 Copy sample input to clipboard
5 500
0 0
Sample Output
5
7
11
101
131
151
181
191
313
353
373
383

题目内容:

给出a,b,其中5<=a<b<=100000000,写一个程序,找出a到b之间的所有回文素数。

输入格式:
一行,二个整数a,b。(0,0结束输入)

输出格式:
输出一个回文质数的列表,一行一个。

样例输入
5  500

0  0

样例输出
5
7
11
101
131
151
181
191
313
353
373
383


题目分析:

1. 看上去很简单,暴力搜索,在范围里面一个个数判断,先判断是否为素数,然后判断是不是回文。结果很明显,严重超时。

2.然后,在网上找到了优化方法:

http://blog.csdn.net/liuhaotian0520/article/details/7838430

分析过程很详细,以下是部分内容:

将顺序反过来,先从小到大生成所有的回文数,然后再去判断素数:
偶数长度的数字中,除11外都是合数,也就是说偶数长度的数字中除11外无质数回文。所以遇到偶数位的数字时,直接跳到下一个数量级(11除外)。
这样就生成了所有的回文数,然后就可以完美AC了。

可AC代码:

#include<iostream>
using namespace std;
bool prime(int num)
{
    for(int j=3;j*j<=num;j=j+2)
    {
     if(num%j==0) return false;
    }
    return true;
}

bool huiwen(int num) //判断是否回文数 
{
   int s[10];  //之前用向量存储,超时了
   int x=0;
   while(num>0)
   {
   s[x]=num%10;
   x++;
   num=num/10;
   }
   for(int i=0;i<x;i++)
   {
    if(s[i]!=s[x-i-1]) return false;
   }
   return true;
}

int length(int num) //判断一个数有多少位 
{
   int wei=0;
  while(num>0)
  {
  num=num/10;
  wei++;
  }
  return wei;
}

int tiao(int wei) //便于下面遇到偶数位的数字时,可以直接跳到下一个数量级 
{
    int tiaoz=1;
    while(wei--)
    {
    tiaoz*=10;
    }
    return tiaoz;
}
int main()
{
  int a,b;
  while(cin>>a>>b)
  {
  if(a==0&&b==0) return 0;
  for(int i=a;i<=b;i++)
  {
    if(i%2==0&&i!=2) continue;
    if(i%5==0&&i!=5) continue;
    if(!huiwen(i)) continue; //先判断是不是回文数,这样会更快 
    if(length(i)%2==0&&i!=11) //如果是偶数位的回文数,除了11以外,其他都可以被11整除,所以直接跳到下一个数量级 
    {
     i=tiao(length(i));
     continue;
    }
    if(prime(i))  cout<<i<<endl;
  }
  }
  //system("pause");
  return 0;
}
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值