前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 ><Sicily>1005. Prime Palindromes质数回文数的判断方法

<Sicily>1005. Prime Palindromes质数回文数的判断方法

作者头像
梦飞
发布于 2022-06-23 03:32:39
发布于 2022-06-23 03:32:39
38400
代码可运行
举报
文章被收录于专栏:csdn文章同步csdn文章同步
运行总次数:0
代码可运行

原题如下

1005. Prime Palindromes Time Limit: 1sec Memory Limit:256MB

Description

The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 100,000,000); both a and b are considered to be within the range .

简译:找出a到b之间既是回文数又是质数的数。

Input

There are multiple test cases.

Each case contains two integers, a and b.

a=b=0 indicates the end of input.

Output

For each test case, output the list of palindromic primes in numerical order, one per line.

Sample Input Copy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5 500
0 0

Sample Output Copy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5
7
11
101
131
151
181
191
313
353
373
383

思路

首先分成两部分考虑。

回文数

怎么找出a和b之间的回文数?一个个判断? 有一个比较快的方法就是构造,因为根据回文数的性质,很容易构造出一定范围内的回文数。比如,用12,可以构造出121和1221;234可以构造出23432和234432。到这里我们大概可以看出规律了,一个n位数可以构造出2n-1或者2n位的回文数。

那从哪个数开始构造起呢?我们可以先计算下限a的位数digit,然后其(digit+1) / 2就是开始构造的数的最小位数,比如a是500,共有3位数,那么就从2位数开始构造起,从10-99可以构造出505,606,999等比500大的回文数,如果还没到达上限,就继续用三位数即100-999构造,直到超出上限为止。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void palindromesBetween(int a, int b){
	// 根据a的位数计算下限 
	int digit = 0; // a 的位数 
	int temp = a;
	while(temp > 0){
		temp = temp / 10;
		digit++;
	}
	int min = 1;
	for(int i = 1; i < (digit + 1) / 2; i++){
		min *= 10;
	}
	for(int low = min; low < b; low *= 10){ // 从最小的数开始构造 
		int res;
		for(int i = 0; i < 2; i++){ // 分两种情况构造 
			for(int num = low; num < low * 10; num++){
				if(i == 0) res = num / 10; // 奇数位数 
				else if(i == 1) res = num; // 偶数位数 
				int n = num;
				while(n > 0){
					res = res * 10 + n % 10;
					n = n / 10;
				}
				if(res > b) break; // 超出上限,停止构造 
				if(res >= a)
					cout << res << endl;
			}
			if(res > b) break;
		}
		if(res > b) break;
	}
}

质数

一个简单的判断方法就是用数x除以2~x/2,如果都不能除尽,则说明x没有除了1和本身之外的因数,则为质数。

但还有另外一个更快的方法,可以跳过很多没必要判断的数。原理是:一个大于等于5的质数一定可以表示为6n+1或6n+5,即除以6的余数一定是1或5。很容易证明,因为显然6n,6n+2,6n+3,6n+4都不是质数。

但形式为6n+1或6n+5的也不一定是质数。并且,如果x是一个质数,那么一定有6n+1或6n+5的形式,所以必定是一个奇数,所以不可能被6n,6n+2,6n+4整除,另外如果x能被6n+3整除,那么一定得是3的倍数,但是6n是3的倍数,所以6n+1和6n+5不可能是6n+3的倍数,即x不可能被6n+3整除。所以只需要判断该数能否被6n+1或6n+5整除即可,即每6个数只需要判断两个数

此外,其实并不用计算到x/2,因为一个数分解为两个因数,一定有一个大于sqrt(x),一个小于sqrt(x),如果在sqrt(x)左侧找不到因数,那右侧肯定也找不到,所以只需要判断到sqrt(x)

有了这些原理,就可以开始写代码了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool isPrime(int num){
	if(num == 2 || num == 3)
		return true; 
	if(num % 6 != 1 && num % 6 != 5){
		return false;
	}
	for(int i = 5; i <= (int)sqrt(num); i += 6){
		if(num % i == 0 || num % (i + 2) == 0){
			return false;
		}
	}
	return true;
}

合并优化

有了以上的方法,合并起来就可以进行题目的求解了。但其实还可以进行优化。

因为一个偶数长度的回文数,一定可以被11整除,所以不可能是质数。 原因是11的倍数有一个性质:奇数位上数字之和 = 偶数位上数字之和,逆过来也成立。而偶数长度的回文数一定满足这个性质,因为对称的数位一定一个在奇数位一个在偶数位。

所以其实没必要生成偶数位的回文数,这样可以减少很多计算。

再结合题目的数字范围,整合后的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <math.h>

using namespace std;

bool isPrime(int);

int main(){
	int a, b;
	while(true){
		cin >> a >> b;
		if(b == 0) break;
		// 先输出a到11的质数 
		for(int i = a; i <= 11; i++){
			if(isPrime(i)){
				cout << i << endl;
			}
		}
		// 根据a的位数计算下限 
		int digit = 0; // a 的位数 
		int temp = a;
		while(temp > 0){
			temp = temp / 10;
			digit++;
		}
		int min = 10;
		for(int i = 2; i < (digit + 1) / 2; i++){
			min *= 10;
		}
		for(int low = min; low < b; low *= 10){
			int res;
			for(int num = low; num < low * 10; num++){
				res = num / 10;
				int n = num;
				while(n > 0){
					res = res * 10 + n % 10;
					n = n / 10;
				}
				if(res > b) break;
				if(res >= a && isPrime(res))
					cout << res << endl;
			}
			if(res > b) break;
		}
	}
}

bool isPrime(int num){
	if(num % 6 != 1 && num % 6 != 5){
		return false;
	}
	for(int i = 5; i <= (int)sqrt(num); i += 6){
		if(num % i == 0 || num % (i + 2) == 0){
			return false;
		}
	}
	return true;
}

另外附上判断一个数是否为回文数的方法: 思路是把这个数倒过来看是否跟原来相等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool isPalindrome(int num){
	int newNum = 0;
	int n = num;
	while(n > 0){
		int r = n % 10;
		n = n / 10;
		newNum = newNum * 10 + r;
	}
	return newNum == num;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
华为认证Datacom 综合拓扑案例
1、PC1\PC2\PC3\PC4采用DHCP自动获取IP地址,SW5作为服务器,SW3和SW4作为中继
青灯古酒
2023/10/16
3090
华为认证Datacom 综合拓扑案例
华为认证数通高级证书实验
青灯古酒
2023/10/16
2720
华为认证数通高级证书实验
华为认证DATACOM-HCIP级别实验
青灯古酒
2023/10/16
2430
华为认证DATACOM-HCIP级别实验
这个实验会做了,网络基础基本掌握一半了
实验案例:在华为ensp软件上模拟实验,对本阶段的知识进行汇总实验 实验环境 如图所示,在win10下使用华为ensp软件上进行模拟实验
不吃小白菜
2020/09/03
7880
这个实验会做了,网络基础基本掌握一半了
华为模拟器配置实训【网络工程师必考】2022.10.3
CSDN话题挑战赛第2期 参赛话题:学习笔记 文章目录 前言 一、华为基础(配置+实训) 二、VLAN(配置) 三、 DHCP(配置) 四、ACL(配置) 五、NAT(配置) 六、华为模拟器综合(原理+基础配置+实训) 1️⃣ACL [1]ACL技术背景 [2]ACL概述 [3]ACL组成 [4]ACL特殊通配符(反掩码) [5]ACL分类 6]ACL匹配效果![请添加图片描述 [7]ACL应用位置 [8]ACL具体配置 2️⃣DHCP 【1】DHCP工作原理 【2】DHCP租期更新 【3】DHCP
MIKE笔记
2023/03/23
6930
华为模拟器配置实训【网络工程师必考】2022.10.3
做完这个实验你才会真的明白什么是DHCP!!!
实验案例:在华为ensp软件上做DHCP中继实验 实验环境 如图所示,在win10下使用华为ensp软件上进行模拟实验
不吃小白菜
2020/09/03
5010
做完这个实验你才会真的明白什么是DHCP!!!
1+X证书网络系统建设与运维(中级)实验整理
园区本地服务器区,为校园用户提供内网服务。为了保证链路的稳定性,同时在不升 级硬件设备的前提下最大限度的提升带宽。在 Agg01 与 Acc03 之间配置链路聚合。请 通过 Lacp 模式实现二层链路聚合,成员接口为 GE0/0/3、GE0/0/4,链路聚合接口 ID 为 1。
青灯古酒
2023/10/16
4250
1+X证书网络系统建设与运维(中级)实验整理
ENSP HCIP BGP初级实验2
残浔
2023/06/04
3660
ENSP HCIP BGP初级实验2
静态路由调用BFD「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
3720
静态路由调用BFD「建议收藏」
华为三层交换机配置不同网段互通[通俗易懂]
傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。——–王小波
全栈程序员站长
2022/10/01
2.7K0
华为三层交换机配置不同网段互通[通俗易懂]
eNSP静态路由配置_ensp多条静态路由互联
路由器的工作原理: (1)解封装:此处解封装的前提是目的mac地址是自己才能解封装 (2)根据目的ip查路由表转发数据。 查看路由表的命令:[Huawei]display ip routing-table 此处分两种情况:
全栈程序员站长
2022/11/08
2.5K0
eNSP静态路由配置_ensp多条静态路由互联
H3C_S3600 简单配置
<H3C> <H3C> <H3C>sy <H3C>system-view System View: return to User View with Ctrl+Z. [H3C]di [H3C]display cu [H3C]display current-configuration #  sysname H3C # radius scheme system # domain system # vlan 1  name home # vlan 2  name hanyutuiguang # vlan 3  name huanongzaixian # vlan 4  name dajiaoshi # vlan 5  name dongshizhang # vlan 6  name caiwubu #                                         vlan 7  name wufuqi # vlan 9 to 4092 # vlan 4094 # interface Vlan-interface1  ip address 192.168.1.254 255.255.255.0 # interface Vlan-interface2  ip address 192.168.2.254 255.255.255.0 # interface Vlan-interface3  ip address 192.168.3.254 255.255.255.0 # interface Vlan-interface4  ip address 192.168.4.254 255.255.255.0 # interface Vlan-interface5  ip address 192.168.5.254 255.255.255.0 # interface Vlan-interface6  ip address 192.168.6.254 255.255.255.0   # interface Vlan-interface7  ip address 192.168.7.254 255.255.255.0 # interface Aux1/0/0 # interface Ethernet1/0/1 # interface Ethernet1/0/2 # interface Ethernet1/0/3  port access vlan 2 # interface Ethernet1/0/4  port access vlan 2 # interface Ethernet1/0/5  port access vlan 2 # interface Ethernet1/0/6  port access vlan 3 # interface Ethernet1/0/7  port access vlan 3                       # interface Ethernet1/0/8  port access vlan 3 # interface Ethernet1/0/9  port access vlan 4 # interface Ethernet1/0/10  port access vlan 4 # interface Ethernet1/0/11  port access vlan 4 # interface Ethernet1/0/12  port access vlan 5 # interface Ethernet1/0/13  port access vlan 5 # interface Ethernet1/0/14  port access vlan 5 # interface Ethernet1/0/15  port access vlan 5                       # interface Ethernet1/0/16  port access vlan 6 # interface Ethernet1/0/17  port access vlan 6 # interface Ethernet1/0/18  port access vlan 7 # interface Ethernet1/0/19  port access vlan 7 # interface Ethernet1/0/20  port access vlan 7 # interface Ethernet1/0/21 # interface Ethernet1/0/22 # interface Ethernet1/0/23 # interface Ethernet1/0/24 #                                         interface Gigab
py3study
2020/01/09
4600
二层漫游会遇到哪些事儿
同一AC的二层漫游:指的是在同一个AC下面的不同AP之间进行漫游,而且业务VLAN都是相同的,比如AP-1的业务VLAN 是10,而AP-2的业务VLAN也是10,漫游过去后是在同一个业务VLAN之间漫游。
ICT系统集成阿祥
2025/02/19
1150
二层漫游会遇到哪些事儿
华为1+X认证网络系统管理与运维中级实验
例如::处于杭州校园的核心层路由器,命名为:HZ-HZXiaoYuan-Core01-AR6140。
青灯古酒
2023/10/16
1.5K0
华为1+X认证网络系统管理与运维中级实验
网工小白升级打怪篇(七)动态路由协议ospf单区域配置
R1(config-if)#ip add 192.168.1.254 255.255.255.0
释然IT杂谈
2020/11/16
9230
网工小白升级打怪篇(七)动态路由协议ospf单区域配置
网工小白升级打怪篇(五)静态路由详解及案例分享
静态路由是指由用户或网络管理员手工配置的路由信息。当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。当然,网管员也可以通过对路由器进行设置使之成为共享的。静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息。
释然IT杂谈
2020/10/09
1.5K0
网工小白升级打怪篇(五)静态路由详解及案例分享
华为超级vlan配置_华为p9参数配置
了解super VLAN之前,我们想想,如果没有super VLAN是什么样的情况?
全栈程序员站长
2022/10/02
7430
华为超级vlan配置_华为p9参数配置
单臂路由实现不同VLAN间通信(华为)
单臂路由(router-on-a-stick)是指在路由器的接口上通过配置子接口(逻辑接口)的方式,在原来相互隔离的不同VLAN之间实现互联互通。
用户5921339
2025/05/20
1660
单臂路由实现不同VLAN间通信(华为)
华为静态路由配置[通俗易懂]
静态路由(Static Router)是由管理员通过手动配置的方式创建的路由,可以让路由器便捷的获知到达目的网络的路由。在静态路由基础上也可使用负载均衡、路由备份等技术。
全栈程序员站长
2022/11/09
2.5K0
华为静态路由配置[通俗易懂]
ACL-访问控制列表
点击启动,在1号终端上ping服务器地址,然后填入服务器地址,点击登录,即可看到服务器上的目录,这里可以上传或者下载文件
全栈程序员站长
2022/09/15
6060
相关推荐
华为认证Datacom 综合拓扑案例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验