题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 【a,b】范围内的回文质数,(5≤a<b≤100,000,000)
原题链接
这里我使用了线性筛法。线性筛法和埃氏筛法都可以解决。
题解如下:
#include <bits/stdc++.h>
using namespace std;
bool isprime[100000001];
int prime[100000001];
//判断回文数字
void ishuiwen(int n)
{
int k=n;
int num=0;
while(n)
{
num=num*10+n%10;
n/=10;
}
if(num==k)
{
cout<<k<<endl;
}
return;
}
int main()
{
int a,b;
int s=0;
cin>>a>>b;
//没有下面这一段就会出现TLE,所以下面这里根据所有偶数位的回文数都不是质数,所以可以直接剪掉10^8的所有数
if(b>10000000)
{
b=10000000;
}
//开始线性筛选
for(int i=1;i<=b;i++)
{
isprime[i]=true;
}
for(int i=2;i<=b;i++)
{
//找到一个质数就加prime中
if(isprime[i])
{
s++;
prime[s]=i;
}
for(int j=1;j<=s;j++)//遍历prime数组
{
if(i*prime[j]>b)//判断两个质数相乘的结果是否超过了区间最大值
{
break;
}
isprime[i*prime[j]]=false;//标记两个质数相乘的结果
if(i%prime[j]==0)
{
break;
}
}
}
//线性筛选结束,此时prime中的全是1-b之间的所有质数
//输出数组
for(int i=1;i<=s;i++)
{
if(prime[i]>=a)
{
ishuiwen(prime[i]);
}
}
return 0;
}