版权声明:莉莉莉 https://blog.csdn.net/qq_41700151/article/details/82843650
Description
因为151即是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 号是回文质数。 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)间的所有回文质数;
Input
第 1 行: 二个整数 a 和 b
Output
输出一个回文质数的列表,一行一个。
Sample Input
5 500
Sample Output
5
7
11
101
131
151
181
191
313
353
373
383
思路:因为数据量太太太大了,要从质数里面找回文数,所以就只能找所有的回文数然后再判断是不是质数啦,那么100,000,000之内的回文数也没有办法找,就构造吧,从10开始构造就可以了,就是101,11就是111,12就是121,所以从10构造到10000之内的就可以了,再判断是否是素数。
代码:
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))
using namespace std;
int zz[800];
int prime(int n)
{
for(int i=2; i*i<=n; i++)
if(n%i==0)
return 0;
return 1;
}
int huiwen(int n)
{
int ans=n/10;
while(n)
{
ans=ans*10+n%10;
n/=10;
}
return ans;
}
int main()
{
int a,b;
// int d=0
int d=0;
scanf("%d%d",&a,&b);
int logo=0;
if(a<12)
{
for(int i=a; i<=11; i++)
if(prime(i)==1)
{
zz[logo++]=i;
d++;
}
}
int ans;
for(int i=10; i<=10000; i++)
{
ans=huiwen(i);
if(prime(ans)==1)
{
zz[logo++]=ans;
d++;
}
}
for(int i=0;i<logo;i++)
{
if(zz[i]>=a&&zz[i]<=b)
printf("%d\n",zz[i]);
}
return 0;
}