#include <stdio.h>
#include <stdbool.h>
#include <string.h>
bool flag[100000001]; // 标记素数
int prime[100000001]; // 缓存素数
void EulerSieve(int n) // 欧拉筛选法,时间复杂度O(n)
{
for (int i = 2; i <= n; i++)
{
if (flag[i])
prime[++prime[0]] = i;
for (int j = 1; i * prime[j] <= n && j <= prime[0]; j++)
{
flag[i * prime[j]] = false;
if (i % prime[j] == 0)
break;
}
}
}
int isPN(int n) // 判断是否是回文数(Palindrome Number),时间复杂度O(n)
{
if (n < 0 || (n % 10 == 0 && n != 0))
{
return 0;
}
int s = n, y = 0;
while (s > 0)
{
y = y * 10 + s % 10;
s = s / 10;
}
return n == y ? 1 : 0;
}
int main()
{
int a, b;
memset(flag, true, sizeof(flag));
flag[1] = 0;
scanf("%d %d", &a, &b);
EulerSieve(b);
if (a % 2 == 0)
a++;
for (int i = a; i <= b; i += 2)
{
if (isPN(i) && flag[i])
{
printf("%d\n", i);
}
}
return 0;
}
甚至比传统求素数方法(循环里开根号那个)还慢了0.5秒....