【LeetCode】题解- 866. 回文素数

Lc866回文素数 Lc866回文素数 样例1: input: 6 output: 7 样例2: input: 8 output: 11 样例3: input: 13 output: 101 一个偶数位的回文数一定是 11 的倍数 这个性质不知道一般做不出来;知道这个就能够将所有位数为偶数的数字判断出来。 处理奇数位,只处理一半,可以将时间复杂度从o(n)变成O(sqrt(n)),将123变化后结果应该是12321 传入的是一个数字,转为字符串a。本来我想直接a.reverse()一下,但是报了a 阅读详情

质数、回文、回文质数等问题。

重读基础概念

素数

自然数(natural number):用以计量事物件数和或表示事物次序的数。从 0 开始,由全体非负整数组成的集合。
素数(prime number),又称质数,满足条件:仅有 1 和自身两个正因数的自然数(N≥2)称之为素数。0、1 既不是合数,也不是质数。数论的重要概念。

// 判断质数
int isPrime(int x) {
	if (x<2) return 0;
  	for (int i=2; i*i<=x; i++) {
      	if (x%i==0) return 0;
    }
  	return 1;
}

回文数

回文数(palindrome number),N 是一任意自然数,将 N 的各位数字反向排列所得自然数与 N 相等,正读和倒读都一样的自然数。按数位分析如下:

  • 0~9,个位数全是回文数;
  • 10~99,两位数中,个位数和十位数相同的自然数,也就是 11 的倍数全是回文数;
  • 100~999,三位数中,个位数和百位数相同的自然数全是回文数,d1*100 + d2*10 + d1(1<=d1<=9,0<=d2<=9);
  • 10000~9999,四位数中,个位数和千位数相同,十位数和百位数相同的自然数全是回文数,d1*1000 + d2*100 + d2*10 + d1(1<=d1<=9,0<=d2<=9);
  • etc.
// 数组方法:LeetCode 运行时间,0ms,超过100%的其它方案
int isPalindrome(int x) {
    if (x<0) return 0;
    if (0<=x&&x<=9) return 1;
    if (x%10==0) return 0;

    int num[10]; // INT_MAX 是 9 位数
    int i = 0;
    while (x) {
        num[i++] = x%10;
        x /= 10;
    }
	/** 个人更加习惯的写法是:for,遇到不等就结束 */
    for(int lo=0, hi=i-1; lo<hi; lo++, hi--) {
        if(num[lo]!=num[hi]) return 0;
    }
    return 1;
	/** while 实现方式
	int lo=0, hi=i-1; // 双指针解法
 	while (num[lo] == num[hi]) {
    	if (lo==hi || lo==hi-1) return 1; // 奇数数位 || 偶数数位,到中间结束
      	lo++; hi--;
    }
  	return 0;
    */
}
int reverse(int x) { 
  	int ans = 0; 
  	while (x) { 
      	ans = 10*ans + x%10; x /= 10; 
    } 
  	return ans; 
} 
// 数学方法 
int isPalindrome(int x) { 
  	if (x==reverse(x)} return 1; else return 0; 
}

经典案例重现

P1217 [USACO1.5]回文质数

1- 读题
回文质数,既回文数,又质数,找出 [a, b] 范围内的所有质数,使用换行符分隔(5≤a<b≤100000000)。

  • 输入,一行两个数字 a,b
  • 输出,一个回文质数的列表,一行一个

2- 列举

  • 一位数,0~9 全是回文数,其中,5、7 同时是素数
  • 两位数,回文数全是 11 的倍数,除 11 之外,必然都不是素数
  • 三位数,若个位数和百位数相等,全是回文数,当个位数是偶数,一定能被 2 整除,非素数。个位数和百位数相等,且是奇数时,才有可能是回文质数
  • 四位数,若个位数和千位数相等、十位数和百位数相等,则是回文数,1000*d1 + 100*d2 + 10*d2 + d1 = 1001*d1 + 110*d2 = 11 * ( 91*d1 + 10*d2),四位数的回文数一定能被 11 整除,肯定不是素数。其它,偶数位数的回文数,也一定能被 11 整除,同样不是素数
  • 五位数、七位数等位数为奇数的数字,有可能是回文质数

3- 编程实现
(1)暴力破解:回文和素数分开单独做判断。最后一个测试点,出现 TLE:Time Limit Exceeded. 超时。

#include <iostream>
using namespace std;

int isPrime(int x) {
	if (x < 2) return 0;
	for(int i = 2; i * i <= x; i++) {
		if (x % i == 0) return 0;
	}
	return 1;
}

int isPalindrome(int x) {
	if (x < 0) return 0;
	if (1 <= x && x <= 9) return 1;
	if (x % 10 == 0) return 0;
	
	int num[10]; // INT_MAX 是 9 位数
	int i = 0;
	while (x) {
		num[i++] = x % 10;
		x /= 10;
	}
	
	for(int lo = 0, hi = i - 1; lo < hi; lo++, hi--) {
		if (num[lo] != num[hi]) {
			return 0;
		}
	}
	return 1;
}

int main() {
	int a, b;
	cin >> a >> b;
	// 小优化:素数一定是奇数
	a = a % 2 ? a : a + 1;
	while (a <= b) {
		// 小优化:回文数的判断更省时, && 短路效果
		if(isPalindrome(a) && isPrime(a)) {
			cout << a << '\n';
		}
		a += 2;
	}
	return 0;
}

(2)优化算法:统一回文素数特点,构造回文,且极可能是素数的数字降低循环次数。

#include <cstdio>
using namespace std;

// 根据题况,调整 isPrime
int isPrime(int x) {
	for(int i=3; i*i<=x; i++) if(x%i==0) return 0;
	return 1;
}

int main() {
	int a, b;
	scanf("%d%d", &a, &b);
	// 1- <100 5、7、11
	if (a<=5 && b>=5) printf("%d\n", 5);
	if (a<=7 && b>=7) printf("%d\n", 7);
	if (a<=11 && b>=11) printf("%d\n", 11);
	
	int num = 0;
	// 2- 100~999
	for(int d1=1; d1<=9; d1+=2) {
		for(int d2=0; d2<=9; d2++) {
			num = 101*d1 + 10*d2;
			if(num < a) continue; // 从 a 开始
			if(num > b) return 0; // 到 b 结束
			if(isPrime(num)) printf("%d\n", num);
		}
	}
	
	// 3- 10000~99999
	for(int d1=1; d1<=9; d1+=2) {
		for(int d2=0; d2<=9; d2++) {
			for(int d3=0; d3<=9; d3++) {
				num = 10001*d1 + 1010*d2 + 100*d3;
				if(num < a) continue; // 从 a 开始
				if(num > b) return 0; // 到 b 结束
				if(isPrime(num)) printf("%d\n", num);
			}
		}
	}
	
	// 4- 1000000~9999999
	for(int d1=1; d1<=9; d1+=2) {
		for(int d2=0; d2<=9; d2++) {
			for(int d3=0; d3<=9; d3++) {
				for(int d4=0; d4<=9; d4++) {
					num = 1000001*d1 + 100010*d2 + 10100*d3 + 1000*d4;
					if(num < a) continue; // 从 a 开始
					if(num > b) return 0; // 到 b 结束
					if(isPrime(num)) printf("%d\n", num);
				}
			}
		}
	}
	return 0;
}

866. 回文素数

1- 读题
求出大于或等于 N 的最小回文素数(1 <= N <= 10^8^)。答案肯定存在,且小于 2 * 108。

2- 列举

3- 编程实现
暴力破解超时,统一考虑回文素数特点,避免数字为偶数数位时的循环。

class Solution {
public:
    int isPrime(int x) {
        for(int i=2; i*i <= x; i++) if(x%i==0) return 0;
        return 1;
    }

    int reverse(int x) {
        int ans = 0;
        while (x) {
            ans = ans*10 + x%10;
            x /= 10;
        }
        return ans;
    }

    int isPalindrome(int x) {
        if(x%10==0) return 0;

        int num[10]; // INT_MAX 最大是 9 位数
        int i=0;
        while(x) {
            num[i++] = x%10;
            x /= 10;
        }
        for(int lo=0, hi=i-1; lo<hi; lo++, hi--) {
            if(num[lo] != num[hi]) return 0;
        }
        return 1;
    }

    int primePalindrome(int x) {
        if(x<=2) return 2;
        if(x<=3) return 3;
        if(x<=5) return 5;
        if(x<=7) return 7;
        if(x<=11) return 11;
        if(x<=101) return 101;

        while(true) {
            // if(x == reverse(x) && isPrime(x)) {
            if(isPalindrome(x) && isPrime(x)) {
                return x;
            }
            x ++;
            if (1000 < x && x < 10000) x = 10001;
            else if (100000 < x && x < 1000000 ) x = 1000001;
            else if (10000000 < x && x < 100000000) x = 100000001;
        }
    }
};
Leetcode866. 回文素数(python) 1. 题目 求出大于或等于 N 的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及 13 是素数。 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。 例如,12321 是回文数。 示例 1: 输入:6 输出:7 来源:力扣(LeetCode) 链接:https://leetcode-cn.co... 阅读详情

相关推荐

【暂时完结】Prescan学习笔记

Prescan学习记录1. Prescan基础知识1.1 Conventions·坐标1.2 Road segment·道路片段1.2.1 让一个路段连接其他两个路段1.2.2 配置车道线1.2.3 Road marking·道路标志1.3 Trajectory·轨迹1.3.1 建立一个Path·路径1.3.2 配置Speedprofile1.3.3 Synchronization of Trajectories·轨迹同步1.3.4 Multiple trajectories · 多轨迹分配 1. Pres

dreautumn的博客 1万+

判断回文数(笔记)

现在推广到任意的数字,方法也是大同小异,依旧是将这个数字拆开,对应的位数乘以10的相应次方,然后得到结果,我们可以知道,个位数是×10的n-1次方,(n为位数),依次类推,我们则需要知道这个输入数字的位数。由特殊到一般,首先判断一个位数确定的数字,例如三位数,则可以设a,b,c三个变量,然后将三位数拆开,将百位×1,十位×10,个位×百,然后判断新得到的数字是否和原来一样,一样则是回文数,否则就不是。然后便是相应的拆解和相加。

Unlimitedz的博客 1015

手把手教你用Verilog实现AT24C64的I2C读写(附完整仿真流程)

本文详细介绍了如何使用Verilog HDL设计AT24C64 EEPROM的I2C控制器,并配合ModelSim完成完整的仿真验证流程。内容涵盖I2C协议解析、Verilog状态机设计、AT24C64读写操作实现,以及仿真波形分析和调试技巧,为FPGA开发者提供了一套完整的EEPROM控制解决方案。

3c4x5z6v7b的博客 846

信息学奥赛一本通 1155:回文三位数

只要一个三位数的个位和百位相同,这个三位数就是回文的。遍历所有三位数,用两个函数判断该数是不是回文三位数。解法1:只判断一个数字是不是三位的回文数。设函数判断一个数是不是回文的三位数。设函数判断一个数是不是质数。

liuyi0727的博客 1507

R语言绘图中文显示全攻略:从乱码到完美适配

本文详细解析了R语言绘图中的中文显示问题,从乱码根源到完美适配方案。通过showtext、sysfonts和extrafont等工具包的应用,提供跨平台的中文显示解决方案,涵盖ggplot2图表、PDF/PNG输出及Shiny应用等场景,助力用户高效实现R绘图中文完美呈现。

hp777的博客 259

信捷XDH PLC多轴运动控制实战:Ethercat总线下的C语言封装技巧

本文深入探讨了在信捷XDH PLC平台上,如何利用C语言对EtherCAT总线多轴运动控制进行高效封装。通过设计全局数据池、模块化状态机及用户友好接口,将底层复杂的运动控制函数库抽象为清晰、可复用的高级模块,显著提升程序稳定性与可维护性,并分享了关键的实战避坑经验。

weixin_29188043的博客 160

编写函数判断一个数是否是回文数_每日一个小算法之判断回文数20190811

判断是不是回文数判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。示例 4:输入: 0输出...

weixin_39612540的博客 6273

软考备考:《系统规划与管理师教程》(第2版)第2章——数字ZG与数智化发展

🔴数字化转型的定义:数字化转型是建立在数字化转换、数字化升级基础上,进一步触及组织核心业务,以新建一种业务模式为目标的高层次转型。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 960

:回文素数是指一个数同时为素数和回文数。例如:131是一个素数,同时也是一个回文素数。数字313和757也是如此。 编写程序,显示前100哥儿回文素数。每行显示10个数并且准确对齐,如下所示: 2

public class huiwen{ public static void main(String args[]) {    int a,b,s;  int n=0,i;   outer:for(a=2;n&lt;100;a++)   {         i=2;      while(i&lt;a)    {          if(a%i==0) continue outer;      ...

为你浅酌低吟的梦 7627

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 462

深入剖析 Wenet 下 AISHELL-1 的 run.sh 脚本:从数据准备到模型训练

run.sh脚本用于处理 AISHELL-1 数据集的整个训练和测试流程。我们将逐步分析脚本中的每个部分,包括环境变量、参数设置、各个阶段的执行等。stage: 设置脚本的起始阶段(如数据准备)。stop_stage: 设置脚本的结束阶段。通过对 Wenet 下 AISHELL-1 的run.sh脚本的详细剖析,我们希望你能更好地理解每个步骤的功能及其背后的原理。此脚本不仅为模型训练提供了便利,也为用户自定义和扩展训练流程提供了基础。希望本教程能帮助你顺利完成语音识别项目!

帅小柏的博客 1633

判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。

#include<stdio.h> 3 ​ 4 int main() 5 { 6 int i,i1,i2,i4,i5; 7 scanf("%d",&i); 8 i1=i/10000; 9 i2=i%10000/1000; 10 i4=i%100/10; 11 i5=i%10; 12 if(i1==i5&&i2==i4) 13 { 14 printf("yes"); 15 } else.

Terry_21的博客 3093

Android 13 Settings蓝牙列表卡顿问题排查及优化过程

此时我们的卡顿优化基本完成了,我们应该要考虑内存是否会泄漏,如果大家不知道哪些需要回收可以用leakcanary和android profiler进行内存检测,看代码有没有内存泄漏。

龚礼鹏的博客 2547

leetcode866 回文素数 表

2,3,5,7,11,101,131,151,181,191,313,353,373,383,727,757,787,797,919,929,10301,10501,10601,11311,11411,12421,12721,12821,13331,13831,13931,14341,14741,15451,15551,16061,16361,16561,16661,17471,17971,18...

月落日升 1360

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

leetcode 866.回文素数

原题如下 https://leetcode-cn.com/problems/prime-palindrome/ 题解 方法一 数学暴力 分别判断从N开始的数字是否回文且素数,找到第一个就返回。 此方法在N>9989899时会超时,幸好只是一个,我们可以进行特殊处理。 本方法java实例: /*只有大于9989899的实例会超时,手动添加 *作者@v7fgg *执行用时 :615 ms, 在所有 Java 提交中击败了9.89%的用户 *内存消耗 :38.8 MB, 在所有 Java 提交中击败

zhuruihe2014的博客 393

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Leetcode】866. 回文素数

  题目描述: 求出大于或等于 N 的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及 13 是素数。 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。 例如,12321 是回文数。 示例 1: 输入:6 输出:7 示例 2: 输入:8 输出:11 示例 3: 输...

EasonWong的博客 3167

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Leetcode 866:回文素数

题目描述 求出大于或等于N的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及13 是素数。 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。 例如,12321 是回文数。 示例 1: 输入:6 输出:7 示例2: 输入:8 输出:11 示例3: 输入...

weixin_35338624的博客 452

leetcode —— 866. 回文素数

求出大于或等于 N 的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及 13 是素数。 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。 例如,12321 是回文数。 示例 1: 输入:6 输出:7 示例 2: 输入:8 输出:11 示例 3: 输入:13 输出:101 提示: 1 ...

然后就去远行 333

LeetCode 866. 回文素数(除11外,偶数位的回文数都不是质数)

1. 题目 求出大于或等于 N 的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及 13 是素数。 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。 例如,12321 是回文数。 示例 1: 输入:6 输出:7 示例 2: 输入:8 输出:11 示例 3: 输入:13 输出:101 提示:...

Michael是个半路程序员 2366

leetcode 866. 回文素数

题目连接 思路:分解题目 思路:题目意思很明确,就一句话,让我们找到大于等于N的回文素数。 虽然就一句话,但是却有两个问题。 第一:这个数字要是大于等于N的回文数。 第二:这是数字要是素数。 那么我们先解决第一个问题,如何找大于等于N的回文数。 回文数也就是前面和后面长一个,123321, 12321,这种。 那么我们看前半段就可以了,首先我们可以把N的前半段复制到后半段,也就是覆盖N的后半段。这样就可以保证得到的必定是个回文。 到此,我们保证了是回文,但是却没有保证一定大于等于N,例如N=1234,复

weixin_42496727的博客 1583

JAVA程序设计:回文素数(LeetCode:866)

求出大于或等于N的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及13 是素数。 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。 例如,12321 是回文数。 示例 1: 输入:6 输出:7 示例2: 输入:8 输出:11 示例3: 输入:13 输出:101 ...

信仰.的博客 1374

LeetCode 866. 回文素数--DFS+数据分析

求出大于或等于 N 的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及 13 是素数。 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。 例如,12321 是回文数。 示例 1: 输入:6 输出:7 示例 2: 输入:8 输出:11 示例 3: 输入:13 输出:101 提示: 1 <= N <= 10^8 答案肯定存在,且小于 2 * 10^8。 来源:力扣(LeetCode) 链接:htt

weixin_43918046的博客 208

leetcode | go | 第866题 | 回文素数

【代码】leetcode | go | 第866题 | 回文素数。

iCling的博客 447

力扣866,剑指Offer49题解

文章目录866. 回文素数暴力构造回文数判断剑指offer49 丑数三指针 866. 回文素数 题目链接 暴力 很直接的思路(虽然会TLE) class Solution { public: bool check(int n) { string a=to_string(n); string b=a; reverse(a.begin(),a.end()); return a==b; } bool checkPrime(int n

weixin_52314777的博客 324

LeetCode866. 回文素数

最近几天电脑拿去修,系统还被重装了,今天才写了一个,回文素数,真是折腾的我够呛,不过好在还是出来了。题目求出大于或等于 N 的最小回文素数。回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。例如,2,3,5,7,11 以及 13 是素数。回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。例如,12321 是回文数。 示例 1:输入:6 输出:7 示例...

qq_38595487的博客 1426
上一篇: 【C++基础语法】04 C++ 多分支 if ... else if ... else 、switch 及逻辑表达式
下一篇: 【JavaSE基础】00-计算机基础及环境搭建
老坛算粉
博客等级 码龄12年 708粉丝 73原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老坛算粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值