回文质数
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
因为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
本题我做了较长的时间,判断回文质数很简单即isPrime();isSyS();两个if语句嵌套即可实现,但是提交后发现时间复杂较高,故思考因为判断素数的复杂度较高,应该先判断回文再判断素数,并且对于回文的判断使用数组存储各位数字然后在进行对比也较为冗余,想到回文数正反值相同,所以更改代码如下:
#include<iostream>
#include<math.h>
using namespace std;
bool isPrime(int val){
int q;
for(q = 2; q <= sqrt(val); q++){
if(val % q == 0){
return false;
}
}
if(q > sqrt(val)){
return true;
}
}
bool isSyS(int val){
int a[11];
int i = 0;
int reverseVal = 0;
int valrecord = val;
while(true){
reverseVal = reverseVal*10 + valrecord%10;
valrecord = valrecord/10;
if(valrecord < 1){
break;
}
}
if(reverseVal == val){
return true;
}else{
return false;
}
}
int main(){
int a, b;
cin >> a >> b;
int i;
for(i = a; i < b; i++){
if(isSyS(i)){
if(isPrime(i)){
cout << i << endl;
}
}
}
}
但是提交发现还是不能满足时间复杂度要求,重新审题发现[a,b](5<=a<b<=100,000,000)区间上亿次,如果进行穷举操作则要执行百万次的素数判断,显然时间复杂度很高。
通过在网络检索回文素数的性质,得知4位、6位、8位的回文数都不是素数。由此可以剔除一部分数据,在两位数之内只有三个回文素数,所以三位数以内的素数通过打表来进行计算,其他的按照数位,先生成回文数再进行素数的判断;代码如下:
#include<iostream>
#include<math.h>
using namespace std;
bool isPrime(int val){
int q;
for(q = 2; q <= sqrt(val); q++){
if(val % q == 0){
return false;
}
}
if(q > sqrt(val)){
return true;
}
}
int getlength(int border){
int m = 1, k = border;
while(k > 9){
k /= 10;
m++;
}
return m;
}
int main(){
int a, b;
cin >> a >> b;
int p, q;
p = getlength(a);
q = getlength(b);
if(p <= 1 && q >=1){//一位
if(a <= 5 && b>=5){
cout << 5 << endl;
}
if(a <= 7 && b >= 7){
cout << 7 << endl;
}
}
if(p <= 2 && q >=2){//二位
if(a <= 11 && b >= 11){
cout << 11 << endl;
}
}
if(p <= 3 && q >= 3){//三位
int x,y;
int temp;
for(x = 1; x <= 9; x += 2){
for(y = 0; y <= 9; y++){
temp = x*100 + y*10 + x;
if(temp >= a && temp <= b){
if(isPrime(temp)){
cout<<temp<<endl;
}
}
}
}
}
if(p <= 5 && q >= 5){//五位
int x,y,z;
int temp;
for(x = 1; x <= 9; x += 2){
for(y = 0; y <= 9; y++){
for(z = 0; z <= 9; z++){
temp = x*10000 + y*1000+ z*100 + y*10 +x;
if(temp >= a && temp <= b){
if(isPrime(temp)){
cout<<temp<<endl;
}
}
}
}
}
}
if(p <= 7 && q >= 7){//七位
int x,y,z,t;
int temp;
for(x = 1; x <= 9; x += 2){
for(y = 0; y <= 9; y++){
for(z = 0; z <= 9; z++){
for(t = 0; t <= 9; t++){
temp = x*1000000 + y*100000 + z*10000 + t*1000 + z*100 + y*10 + x;
if(temp >= a && temp <= b){
if(isPrime(temp)){
cout<<temp<<endl;
}
}
}
}
}
}
}
}