Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
9. 回文数
题目 题解 小于 0 肯定不满足条件 大于 0 且尾数为 0,则不满足条件 题解一: 直接转换成字符串,然后 reverse 比较一下。但是题目中有写: 进阶:你能不将整数转为字符串来解决这个问题吗? 所以肯定不能使用这种方式! class Solution { public boolean isPalindrome(int x) { if (x < 0 || (x > 0 && x % 10 ==0)) { return false;
程序员小航
2022/03/14
3090
9. 回文数
​LeetCode刷题实战479:最大回文数乘积
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/12/27
2610
c++版本回文质数 Prime Palindromes 题解(洛谷)
顾名思义,先回文再质数。搜狗百科解释如下:回文素数是一个既是素数又是回文数的整数。回文素数与记数系统的进位制有关。回文素数是指,对一个整数n(n>11)从左 向右和从右向左读其结果值相同且是素数,即称n为回文素数。除了11,偶数位的数不存在回文质数。(以前不知道那现在知道了)。4位,6位,8位…… 不存在回文质数。因为四位及四位以上的偶数位的回文数都可以被11整除,故不存在偶数位的回文质数。最初几个回文素数:11,101 ,131,151,181,191,313,353,373 383,727,757,787,797,919,929…… 两位回文素数1个,三位回文素数15 个,五位回文素数93个,七位回文素数668 个,九位回文素数5172个。
用户11036582
2024/03/21
5050
c++版本回文质数 Prime Palindromes 题解(洛谷)
LeetCode 866. 回文素数(除11外,偶数位的回文数都不是质数)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/prime-palindrome 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2020/07/13
8340
[USACO1.5]回文质数 Prime Palindromes
题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
风骨散人Chiam
2020/10/28
7670
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-491 回文数和质数
        这段时间我会把蓝桥杯官网上的所有非VIP题目都发布一遍,让大家方便去搜索,所有题目都会有几种语言的写法,帮助大家提供一个思路,当然,思路只是思路,千万别只看着答案就认为会了啊,这个方法基本上很难让你成长,成长是在思考的过程中找寻到自己的那个解题思路,并且首先肯定要依靠于题海战术来让自己的解题思维进行一定量的训练,如果没有这个量变到质变的过程你会发现对于相对需要思考的题目你解决的速度就会非常慢,这个思维过程甚至没有纸笔的绘制你根本无法在大脑中勾勒出来,所以我们前期学习的时候是学习别人的思路通过自己的方式转换思维变成自己的模式,说着听绕口,但是就是靠量来堆叠思维方式,刷题方案自主定义的话肯定就是从非常简单的开始,稍微对数据结构有一定的理解,暴力、二分法等等,一步步的成长,数据结构很多,一般也就几种啊,线性表、树、图、再就是其它了。顺序表与链表也就是线性表,当然栈,队列还有串都是属于线性表的,这个我就不在这里一一细分了,相对来说都要慢慢来一个个搞定的。蓝桥杯中对于大专来说相对是比较友好的,例如三分枚举、离散化,图,复杂数据结构还有统计都是不考的,我们找简单题刷个一两百,然后再进行中等题目的训练,当我们掌握深度搜索与广度搜索后再往动态规划上靠一靠,慢慢的就会掌握各种规律,有了规律就能大胆的长一些难度比较高的题目了,再次说明,刷题一定要循序渐进,千万别想着直接就能解决难题,那只是对自己进行劝退处理。加油,平常心,一步步前进。
红目香薰
2023/02/17
2550
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-491 回文数和质数
【leetcode刷题】T216-回文素数
https://leetcode-cn.com/problems/prime-palindrome
木又AI帮
2020/01/03
5850
洛谷P1217 回文质数
题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
风骨散人Chiam
2020/10/28
5230
LeetCode每日一练(回文数)
判断一个数是否为回文数,首先想到的办法就是将其转为字符串,再通过反转字符串来判断是否相同,比如:
wangweijun
2022/01/10
6390
LeetCode每日一练(回文数)
9. Palindrome Number(回文数)
Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.
砖业洋__
2023/05/06
1510
9. Palindrome Number(回文数)
LeetCode 479. 最大回文数乘积
中文题面:给定一个整数 n ,返回可表示为两个 n 位整数乘积的 最大回文整数 。因为答案可能非常大,所以返回它对 1337 取余 。
JIeJaitt
2022/05/06
3480
【LeetCode】回文数
package leetcode.editor.cn; //判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 // // 示例 1: // // 输入: 121 //输出: true // // // 示例 2: // // 输入: -121 //输出: false //解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 // // // 示例 3: // // 输入: 10 //输出: false //解释:
Jacob丶
2020/08/05
5000
2025-04-06:统计好整数的数目。用go语言,给定两个正整数 n 和 k,我们定义一个整数 x 为 k 回文整数的条件是:
2025-04-06:统计好整数的数目。用go语言,给定两个正整数 n 和 k,我们定义一个整数 x 为 k 回文整数的条件是:
福大大架构师每日一题
2025/04/06
700
2025-04-06:统计好整数的数目。用go语言,给定两个正整数 n 和 k,我们定义一个整数 x 为 k 回文整数的条件是:
数论部分第二节:埃拉托斯特尼筛法 埃拉托斯特尼筛法
埃拉托斯特尼筛法 质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。怎么判断n以内的哪些数是质数呢? 埃拉托斯特尼筛法 厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了
Angel_Kitty
2018/04/09
1.3K0
数论部分第二节:埃拉托斯特尼筛法
		埃拉托斯特尼筛法
第六章第二十六题(回文素数)(Palindromic prime) - 编程练习题答案
**6.26(回文素数)回文素数是指一个数同时为素数和回文数。例如:131是一个素数,同时也是一个回文素数。数学313和757也是如此。编写程序,显示前100个回文素数。每行显示10个数,数字中间用一个空格隔开。如下所示:
无刺鱼
2022/03/29
3410
【欧拉计划第 4 题】最大回文数乘积 Largest palindrome product
judge() 判断数字是否为回文数时,用到了数位截取,和 2021 年蓝桥杯省赛 C++ 组 B 题有类似思想,详情参考
攻城狮杰森
2022/06/03
2690
素数定理整合_素数定理简单证明
任何数都可以构造成6N+1,6N+2,6N+3,6N+4,6N+5 只有形如:6N+1和6N+5有可能是素数,其中2,3是特殊的
全栈程序员站长
2022/09/20
5500
小文’s blog–特殊回文数 –《蓝桥杯代码笔记4》
特殊回文数 问题描述   123321是一个非常特殊的数,它从左边读和从右边读是一样的。 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。 输入格式   输入一行,包含一个正整数n。 输出格式   按从小到大的顺序输出满足条件的整数,每个整数占一行。 样例输入 52 样例输出 899998 989989 998899 数据规模和约定   1<=n<=54。 ---- 题目分析 题目要求我们输出的就是一个回文数,不过它比较特殊——各位数字之和加起来等于输入的整数 ---
神无月
2018/06/25
5410
【PAT乙级】延迟的回文数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
3760
【PAT乙级】延迟的回文数
43道Python经典案例题(有答案)
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
Python学习者
2022/11/15
1.4K0
推荐阅读
相关推荐
9. 回文数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验