题目描述
因为 151151151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151151151 是回文质数。
写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)[a,b](5≤a<b≤100,000,000)[a,b](5≤a<b≤100,000,000)(一亿)间的所有回文质数。
输入格式
第一行输入两个正整数 a和ba 和 ba和b。
输入数据 1
5 500
输出数据 1
5
7
11
101
131
151
181
191
313
353
373
383
提示
提示 1: 找出所有的回文数再判断它们是不是质数(素数).
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
产生长度为 555 的回文数:
for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
for (d2 = 0; d2 <= 9; d2++) {
for (d3 = 0; d3 <= 9; d3++) {
palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
}
}
}
数据范围
100% 数据如题目所述
对 200% 数据,另有100%数据, 1≤a≤b≤100000000001 \le a \le b \le 100000000001≤a≤b≤10000000000
答案
#include <cstdio>
#include <algorithm>
using namespace std;
long long n, m, h, s1, s2, a[100000];
long long Pal1(long long x) {
long long s = x;
x = x / 10;
while (x > 0) {
s = s * 10 + x % 10;
x = x / 10;
}
return s;
}
long long Pal2(long long x) {
long long s = x;
while (x > 0) {
s = s * 10 + x % 10;
x = x / 10;
}
return s;
}
bool isPri(long long x) {
if (x < 2)
return false;
for (int i = 2; i <= x / i; i++) {
if (x % i == 0)
return false;
}
return true;
}
int main() {
scanf("%lld %lld", &n, &m);
for (int i = 1; i < 100000; i++) {
s1 = Pal1(i);
s2 = Pal2(i);
if ((s1 >= n && s1 <= m && isPri(s1))) {
a[++h] = s1;
} else if (s2 >= n && s2 <= m && isPri(s2)) {
a[++h] = s2;
}
}
sort(a + 1, a + 1 + h);
for (int i = 1; i <= h; i++) {
printf("%lld\n", a[i]);
}
return 0;
}
353

被折叠的 条评论
为什么被折叠?



