数学知识——素数回文

素数回文
题目描述

小王对既是素数又是回文的数特别感兴趣。比如说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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值