以这道洛谷的题为例:
洛谷P1217https://www.luogu.com.cn/problem/P1217这道题要求需要判断区间[a,b]中的所有回文质数,并且测试数据开到了1亿
首先,判断质数,如果暴力求解,会导致直接超时
所以,这里使用埃氏算法(主要我不会写欧拉算法)
void checkisprime(long long isprime[],long long n)
{
long long sn = sqrt(n);
for (int i = 2; i <= sn; i++)
{
if (isprime[i] == 0)
{
for (int j = 2; j <= n/i; j++)
isprime[i*j] = 1;
}
}
}
直接打表,不再说明
判断回文数,我的思路是数字转换为字符串然后判断,也可以将数字翻转再判断
bool ishuiwen(long long n)
{
string s;
s = to_string(n);
int start = 0, end = s.size() - 1;
while (start < end)
{
if (s[start++] != s[end--])
return false;
}
return true;
}
补充:to_string库函数,将数字直接赋值给string变量,需要引用
下面是主函数,有三个细节:
1)除了11之外,数字的位数为偶数的回文数一定是11的倍数,所以我们可直接省去1亿到1千万的数据判断。
2)打表数组,需要将数组的元素全部置为同一个数,在如此大的数据量下,memset函数(
3)在最后的循环判断中,可以直接跳过偶数,也能快点。
int main()
{
long long a, b;
cin >> a >> b;
long long isprime[10000001];
memset(isprime, 0,sizeof(isprime));
if (b > 10000000) b = 10000000;
checkisprime(isprime, b);
if (a % 2 == 0) a++;
for (int i = a; i <= b; i+=2)
{
if (isprime[i] == 0 && ishuiwen(i))
{
cout << i << endl;
}
}
return 0;
}