- 问答
回文质数超时怎么办
- @ 2026-1-17 11:30:35
#include <bits/stdc++.h>
using namespace std;
long long a, b;
bool is_prime ( long long n)
{
for ( int i = 2; i * i <= n; i ++) if ( n % i == 0) return false;
return true;
}
bool f ( int n)
{
string s1 = to_string(n), s2;
s2 = s1;
reverse (s1.begin(), s1.end());
if ( s1 == s2) return true;
else return false;
}
int main ()
{
cin >> a >> b;
for ( int i = a; i <= b; i ++)
{
if ( i % 2 == 0) continue;
if ( f(i) == true && is_prime(i) == true)
{
cout << i << '\n';
}
}
return 0;
}
[题目](https://www.luogu.com.cn/problem/P1217)
1 comments
-
Myobot @ 2026-1-17 11:31:10
同学你好,我看到你提交的代码是用于解决“回文质数”问题。你的思路是遍历区间内的每个奇数,依次判断是否为回文数和质数。这个思路本身是正确的,但会导致超时,因为数据范围非常大(题目中 b 最大可达 10^8)。我们需要分析一下为什么超时,以及如何优化。
第一步:分析题目难点和核心考点
这道题的核心考点是 “通过构造回文数来大幅减少枚举量”,而不是在巨大的区间内逐个数字判断。你的代码在 [a, b] 区间内逐个判断,最坏情况下需要判断近 10^8 个数,每个数还要进行 O(√n) 的质数判断和 O(位数) 的回文判断,这显然会超时。
第二步:询问你目前的思路或卡壳的地方
从你的代码看,你已经意识到可以跳过偶数(
i % 2 == 0),但优化还不够。你是否注意到题目中给出的提示:“因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。” 以及数据范围 5 ≤ a < b ≤ 100,000,000?第三步:给出解题线索或关键性质
关键性质:
- 除 11 外,所有偶数位数的回文数都是 11 的倍数(因此不是质数)。例如:1221、123321 等。你可以自己验证一下这个规律。
- 在 10^8 以内,回文数的数量其实非常少。我们可以直接生成所有可能的回文数,然后判断它是否在区间内以及是否为质数,而不是遍历所有数字。
引导性问题:
- 在 10^8 以内,回文数最多有多少位?(8 位)
- 如何生成所有 1 位到 8 位的回文数?(例如,对于 5 位回文数 ABCBA,你可以枚举前 3 位 ABC,然后构造出整个回文数)
- 生成回文数后,如何高效判断质数?(你的
is_prime函数对于单个数字是可行的,但需要确保只对生成的、在区间内的回文数调用它)
第四步:提供算法的伪代码框架
你可以考虑以下优化步骤的伪代码:
1. 读入 a, b。 2. 确定生成回文数的位数范围(例如,从 a 的位数到 b 的位数)。 3. 对于每个位数 len: - 如果 len 是偶数且大于 2,跳过(因为除 11 外,偶数位回文数不是质数)。 - 生成所有长度为 len 的回文数: 例如,对于奇数长度 len,枚举前半部分((len+1)/2 位),然后镜像生成整个数。 对于偶数长度 len,只考虑 len=2 的情况(即 11),或者也生成但后续判断(实际上只有 11 是质数)。 4. 对于每个生成的回文数 num: - 如果 num 在 [a, b] 范围内,并且是质数,则输出。第五步:提醒常见的易错点
- 注意边界:a 和 b 可能很大,使用
long long是好的。 - 质数判断时,注意处理 1 和 2 的情况(1 不是质数,2 是质数但 2 不是回文数?实际上题目从 5 开始,所以可以忽略)。
- 生成回文数时,注意前导零问题(例如,生成 010 会导致实际数字 10,但回文数不应有前导零)。
- 对于偶数位回文数,只有 11 是质数,所以你可以特殊处理 11。
建议
请你先思考一下如何实现“生成回文数”的部分。你可以尝试先写一个函数,给定前半部分数字和总位数,生成对应的回文数。然后,只对生成的这些回文数进行质数判断,这样枚举量会从 10^8 级别降到大概 10000 级别(因为 1-8 位的回文数总数很少),就不会超时了。
如果你有了新的思路或代码,可以再发上来,我们可以继续讨论其中的细节或潜在问题。记住,我们的目标是让你掌握这种“逆向构造”的优化思想,这在很多竞赛题中都会用到。
- 1