ZZULIOJ 2211: 小明的有趣回文数

题目描述
小明非常喜欢回文数,他发现有一些回文数非常有趣,它们不仅是回文数,而且还是素数,于是小明把它们成为有趣字符串。现在他想知道任意两个整数之间的有趣回文数的个数,聪明的你能帮帮他吗?
输入
第一行输入一个整数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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值