素数回文
题目描述
小王对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在小王想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000);
输入
输入a和b(5 <= a < b <= 100,000,000)
输出
按从小到大输出a,b之间所有满足条件的素数回文数
样例输入
5 500
样例输出5 7 11 101 131 151 181 191 313 353 373 383
代码:
Runtime Error,原因:
因为是 多组输入,不能直接将素数判断函数和回文函数一起在主函数中进行整合
因为每次整合,都需要遍历到MAX两次,
多组输入,每次输入都整合一次的话,这谁受得了,不是超时就是超内存
倒不如 先搞个整合函数,将MAX前的所有素数回文函数都找出来到a数组中
主函数中直接调用a函数,就不会超时或超内存了
下面是
RE代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define MAX 10000000
using namespace std;
bool s[MAX];
void sushu()
{
memset(s, true, sizeof s);
for (int i = 2; i <= MAX; i++)
{
if (s[i])
{
for (int j = i + i; j < MAX; j += i)
{
s[j] = false;
}
}
}
}
bool huiwen(int n)//回文
{
int res = 0;
int temp = n;
while (temp)
{
res = temp % 10 + res * 10;
temp /= 10;
}
return (res == n);
}
int main()
{
int a, b;
sushu();
while (~scanf("%d%d", &a, &b))
{
for (int i = a; i <= b; i++)
{
if (huiwen(i) && s[i])
{
cout << i << endl;
}
}
}
return 0;
}
下面为AC代码:
#include<iostream>
#include<cstring>
#define MAX 10000000
bool isPrim[MAX];
int a[1000];
int n;
//函数运行结束后,得到一个判断过素数的 isPrim数组
void sushu()//素数判断函数
{
//注意1:memset头文件不是algorithm,而是cstring
//注意2:将数组 初始化为true,因为bool类型默认值为false
memset(isPrim,true,sizeof isPrim);
for(int i=2;i<MAX;i++)
{
if(isPrim[i])
{
for(int j=i+i;j<MAX;j+=i)
{
isPrim[j]=false;
}
}
}
}
//回文判断函数
bool huiwen(int x)
{
int y=0,temp=x;
while(x)
{
y=y*10+x%10;
x/=10;
}
return temp==y;
}
//素数回文函数
//将素数和回文整合到一起,主函数里只调用这一个函数就够了
void zhenghe()//计数,将回文素数存入a数组中
{
n=0;
sushu();//调用素数判断函数
a[n++]=2;//这一步是什么意思?//1和2都是回文素数
//为什么要i+=2?
//省时间,经验分析,回文素数都是不相邻的数
for(int i=3;i<MAX;i+=2)
{
//注意,一个是 素数数组,一个是 回文函数
if(isPrim[i]&&huiwen(i))
{
a[n++]=i;//素数回文数存入数组a中
}
}
}
int main()
{
int x,y;
zhenghe();//调用整合后的素数回文函数
while(~scanf("%d %d",&x,&y))
{
for(int i=0;i<n;i++)
{
//特判一下边界
if(a[i]<x)
continue;
else if(a[i]>y)
{
break;
}
else
{
printf("%d\n",a[i]);
}
}
printf("\n");//记得最后输出一个空行
}
return 0;
}