问题描述:求a~b中所有的回文质数。
解题思路:遍历回文质数的位数,然后构造回文质数,详细的看代码注解即可~~
代码实现:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e7+5;
int a[10], p[maxn];
int IsPrime(int n)//判断素数
{
int s = sqrt(n);
for(int i = 2; i <= s; i++)
{
if(n % i == 0)
return 0;
}
return 1;
}
int fun(int flag, int n)//得到一个回文数
{
int i, k = 0, sum;
while(n >= 1)
{
a[k++] = n % 10;
n /= 10;
}
if(flag)//得到一个偶数位的回文数,比如123321
{
sum = 0;
for(i = 2*k-1; i >= 0; i--)
{
if(i >= k) sum = a[i-k] + sum * 10;
else sum = a[k-1-i] + sum * 10;
}
return sum;
}//得到一个奇数位的回文数,比如12321
else
{
sum = 0;
for(i = 2*k-2; i >= 0; i--)
{
if(i >= k) sum = a[i-k+1] + sum * 10;
else sum = a[k-1-i] + sum * 10;
}
return sum;
}
}
int main()
{
int a, b, i, j, l, r, t, k = 0;
for(i = 1; i <= 4; i++)//遍历位数,因为最多是八位(1e9以内),所以遍历4位即可。
{
l = pow(10, i-1);//当前位数最小数
r = pow(10, i) - 1;//当前位数最大数
for(j = l; j <= r; j++)
{
t = fun(0, j);//得到奇数位回文数
if(IsPrime(t)) p[k++] = t;//如果是素数就放进去
t = fun(1, j);//得到偶数位回文数
if(IsPrime(t)) p[k++] = t;//如果是素数就放进去
}
}
sort(p,p+k);//不知道是否需要排序,应该是不用的,但还是保险一点
while(cin >> a >> b)
{
for(i = 0; i < k; i++)
{
if(p[i]>=a&&p[i]<=b)//在范围内就输出呗
printf("%d\n",p[i]);
}
}
printf("\n");
}