题目
分析
这道题合理的解法是,先构造相应的回文数字,然后判定是否是素数。
结论:除了11,所有偶数位数的回文数都不可能是素数。证明见“思考”部分。
如何构造奇数位数的回文数呢?一个典型的循环如下:
for (int d1 = 1; d1 <= 9; d1 += 2)
{
for (int d2 = 0; d2 <= 9; ++d2)
{
int val = d1 * 100 + d2 * 10 + d1;
if (val <= b && val >= a)
out.push_back(val);
}
}
具体用多少个循环,要根据题目给出的范围而定。
确定了回文数后,在进行常规的素数判定会更快,因为总体需要判定的数字少了许多。
答案

思考
对于上文的结论:如果一个回文数是2/4/6/8……等偶数位的,那么一定不会是素数(除了11)。如何严格证明?
首先,一个数如果能被11整除,那么它的奇数位数字的和与偶数位数字的和的差,一定是可以整除11的。
观察一下一个偶数位数的回文数的组成,一定是形如:\(a_1a_2a_3...a_ka_k...a_3a_2a_1\)。两个对应的数字的位置,形成了第i位和2k-i-1位的关系。而这个关系中的两个位置,一定是一个在奇数位,一个在偶数位。所以,这个数的偶数位数字加起来,一定等于奇数位数字加起来。其差为0,也就一定是11的倍数。
