题目描述
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以151是回文质数。写一个程序来找出范围[a,b](5≤a≤b≤100,000,000)间的所有回文质数。
输入格式
一行,二个整数a,b。
输出格式
输出一个回文质数的列表,一行一个。
样例输入
5 500
样例输出
5
7
11
101
131
151
181
191
313
353
373
383
时间限制/内存限制
1S / 128Mb
这道题目是USACO上的题目(已经翻译过,原题是英文)。看到这道题目的时候第一想法就是直接暴搜。用筛法求出[1,100000000]内的素数,然后依次判断每一个素数是否是回文数。
然后就开始写了,飞快地在5分钟之内写完了代码,写完之后还在想为何如此简单。结果提交之后就悲剧了,超时超空间。
然后就开始分析超时的原因,发现原因有以下两点:
一、空间复杂度。如果要用筛法求[1,100000000]内的所有素数,就要开一个100000000的数组,这个数组就比较大了,会超出空间限制。
二、由空间复杂度延伸出的时间复杂度。在数组的重置清零上就要不少时间,然后筛法求素数的时间也很久。
看来这个方法是不行了,然后就开始思考另一种思路。将顺序反过来,先从小到大生成所有的回文数,然后再去判断素数:
设要生成的回文数的长度是length:如果length是奇数,就从小到大枚举所有((l+1)/2)位数,然后翻转;如果length是偶数,就从小到大枚举所有(l/2)位数,然后翻转。
这样就生成了所有的回文数,然后就可以完美AC了。
但是在思考第二种方法的时候突然发
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以151是回文质数。写一个程序来找出范围[a,b](5≤a≤b≤100,000,000)间的所有回文质数。
输入格式
一行,二个整数a,b。
输出格式
输出一个回文质数的列表,一行一个。
样例输入
5 500
样例输出
5
7
11
101
131
151
181
191
313
353
373
383
时间限制/内存限制
1S / 128Mb
这道题目是USACO上的题目(已经翻译过,原题是英文)。看到这道题目的时候第一想法就是直接暴搜。用筛法求出[1,100000000]内的素数,然后依次判断每一个素数是否是回文数。
然后就开始写了,飞快地在5分钟之内写完了代码,写完之后还在想为何如此简单。结果提交之后就悲剧了,超时超空间。
然后就开始分析超时的原因,发现原因有以下两点:
一、空间复杂度。如果要用筛法求[1,100000000]内的所有素数,就要开一个100000000的数组,这个数组就比较大了,会超出空间限制。
二、由空间复杂度延伸出的时间复杂度。在数组的重置清零上就要不少时间,然后筛法求素数的时间也很久。
看来这个方法是不行了,然后就开始思考另一种思路。将顺序反过来,先从小到大生成所有的回文数,然后再去判断素数:
设要生成的回文数的长度是length:如果length是奇数,就从小到大枚举所有((l+1)/2)位数,然后翻转;如果length是偶数,就从小到大枚举所有(l/2)位数,然后翻转。
这样就生成了所有的回文数,然后就可以完美AC了。
但是在思考第二种方法的时候突然发