洛谷P1217 回文质数 10.26

P1217 [USACO1.5] 回文质数 Prime Palindromes
题目描述

因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)(一亿)间的所有回文质数。

输入格式

第一行输入两个正整数 a 和 b

输出格式

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

include

include

include

using namespace std;

bool isprime(long long x)
{
if(x < 2) return false;
if(x == 2) return true;
if(x % 2 == 0) return false;
for(long long j = 3; j * j <= x; j += 2)
{
if(x % j == 0)
return false;
}
return true;
}

long long build(string s)
{
string t = s;
reverse(t.begin(), t.end());
s.pop_back();
s += t;
return stoll(s);
}

int main(){
int a, b;
cin >> a >> b;

if(a <= 5 && 5 <= b) cout << 5 << endl;
if(a <= 7 && 7 <= b) cout << 7 << endl;//一位

if(a <= 11 && 11 <= b) cout << 11 << endl;//两位

for(int len = 2; len <= 4; len++)//3 5 7位
{
int st = 1;
for(int k = 1; k < len; k++) st *= 10;
int ed = st * 10 - 1;//种子的取值范围
for(int seed = st; seed <= ed; seed++)
{
long long num = build(to_string(seed));
if(num > b) continue;
if(num >= a && isprime(num))
{
cout << num << endl;
}
}
}
return 0;
}
本题最大的问题就是考虑数值溢出以及遍历可能导致的超时问题。对于第一点,使用 long long跟 stoll即可解决。
对于第二点,我们选择生成回文素数,而非遍历后输出,同时我们要意识到,偶数位数字无回文素数(11除外)。
构造互文素数的方法即是构造build外置函数,由
int st = 1;
for(int k = 1; k < len; k++) st *= 10;
int ed = st * 10 - 1;
确定种子(seed)的取值范围即位数。
最后成功AC.

posted @ 2026-10-26 20:29  Mutusmi2580  阅读(5)  评论(0)    收藏  举报