我逛了一下洛谷题单,发现了一个新的题,我看着还不错(P1217 [USACO1.5] 回文质数 Prime Palindromes)。
下面就是题目。
题目描述
因为 151151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151151 是回文质数。
写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)(一亿)间的所有回文质数。
输入格式
第一行输入两个正整数 aa 和 bb。
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入 #1复制
5 500
输出 #1复制
5 7 11 101 131 151 181 191 313 353 373 383
他让我们找的数既要是回文数,也要是质数。
需要判断的函数我已经准备好了。
1.回文数
bool check2(int x){
int a[20], flag = 1;
while (x > 0){
a[flag] = x % 10;
x /= 10;
flag++;
}
for (int i = 1; i <= flag / 2; i++)
if(a[i] != a[flag-i]) return 0;
return 1;
}
2.质数
bool check3(int x){
if(x == 2) return 1;
for(int i = 2; i <= sqrt(x); i++) if(x % i == 0) return 0;
return 1;
}
完整的程序也送来了:
#include<bits/stdc++.h>
using namespace std;
int l, r;
bool check1(int x){
if((1000 <= x && x <= 9999) || (100000 <= x && x <= 999999)) return 0;
return 1;
}
bool check2(int x){
int a[20], flag = 1;
while (x > 0){
a[flag] = x % 10;
x /= 10;
flag++;
}
for (int i = 1; i <= flag / 2; i++)
if(a[i] != a[flag-i]) return 0;
return 1;
}
bool check3(int x){
if(x == 2) return 1;
for(int i = 2; i <= sqrt(x); i++) if(x % i == 0) return 0;
return 1;
}
int main(){
scanf("%d %d", &l, &r);
if(l == 2) printf("2\n");
if(l % 2 == 0) l++;
r = min(9999999, r);
for(int i = l; i <= r; i = i + 2){
if(check1(i) == 0) continue;
if(check2(i) == 0) continue;
if(check3(i) == 0) continue;
printf("%d\n", i);
}
return 0;
}