题目描述
小明非常喜欢回文数,他发现有一些回文数非常有趣,它们不仅是回文数,而且还是素数,于是小明把它们成为有趣字符串。现在他想知道任意两个整数之间的有趣回文数的个数,聪明的你能帮帮他吗?
输入
第一行输入一个整数T,代表实例的数量。(T < 10000)
接下来T行,每行输入两个整数a,b。(0<= a <= b <= 10000000)
输出
输出有T行 , 每行输出一个整数,代表[a,b]间内的有趣回文数的个数。
样例输入
2
2 5
10 20
样例输出
3
1
给的数据规模,需要打卡,直接判断的话会超时,可以对称再判断是不是素数就可以了。
#include<bits/stdc++.h>
int c[10000002];
using namespace std;
int su(int n){
if (n == 1 || n == 0)return 0;
for (int i = 2; i <= sqrt(n); i++)
if (n%i == 0)return 0;
return 1;
}
int fun(int n){
string s, m, b;
int sum = 0, sum1 = 0, sum2 = 0;
while (n)
s.push_back(n % 10 + '0'), n /= 10; //先将要判断的数字转化成字符串
b = s;
reverse(s.begin(), s.end());
int len = s.size();
for (int i = 0; i <= len - 2; i++) //对称后的字符串有两种一个是直接对称,一个是以最后一个为对称中心
m.push_back(s[i]);
reverse(m.begin(), m.end());
m = s + m; //从最后一个字符开始对称,例如12,转化后就是121
s = s + b; //直接对称,例如输入的12,转化后就是1221
int len1 = s.size(), len2 = m.size(); //再转化成数字,判断是不是素数。
for (int i = 0; i < len1; i++)
sum1 = sum1 * 10 + s[i] - '0';
for (int i = 0; i < len2; i++)
sum2 = sum2 * 10 + m[i] - '0';
if (su(sum1))c[sum1]++;
if (su(sum2))c[sum2]++;
}
int main(){
int sum = 0;
for (int i = 0; i <= 10000; i++)
fun(i);
for (int i = 0; i <= 10000000; i++)
{
if (c[i] != 0)sum++;
c[i] = sum;
}
int t, a, b;
cin >> t;
while (t--)
{
cin >> a >> b;
if (a == 0)a++;
cout << c[b] - c[a - 1] << endl;
}
return 0;
}