1. 问题背景与定义
今天在刷算法题时遇到一个有趣的数学问题——"新对称素数"。题目要求找出所有满足特定条件的素数,这类问题在编程竞赛和算法面试中经常出现。我们先明确下题目要求:
给定整数区间 [L,R],需要找出所有同时满足以下两个条件的素数:
- 该素数本身是回文数(正读反读相同)
- 该素数的数字反转后得到的数也是素数
例如,13是素数,反转得到31也是素数,但13不是回文数,所以不符合;而131是回文素数,反转后还是131也是素数,因此符合条件。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数学基础与算法选择
2.1 素数判定优化
传统素数判定方法(试除法)时间复杂度为O(√n),当n较大时效率低下。我们可以采用以下优化:
- 预处理筛法:使用埃拉托斯特尼筛法预先计算范围内的素数
python复制def sieve(limit):
sieve = [True] * (limit + 1)
sieve[0] = sieve[1] = False
for i in range(2, int(limit**0.5)+1):
if sieve[i]:
for j in range(i*i, limit+1, i):
sieve[j] = False
return sieve
- Miller-Rabin概率性测试:适用于大数判断,时间复杂度O(k log³n)
2.2 回文数判定技巧
回文数判定有多种实现方式,效率对比:
- 字符串反转法:O(n)时间复杂度,代码简洁
python复制def is_palindrome_str(n):
s = str(n)
return s == s[::-1]
- 数学构造法:O(log n)时间复杂度,无需类型转换
python复制def is_palindrome_math(n):
original = n
reversed_num = 0
while n > 0:
reversed_num = reversed_num * 10 + n % 10
n = n // 10
return orig
