C/C++实现回文质数(超详解)【沈七】
C/C++实现回文质数(超详解)
- 题目链接
- 题目描述
- 输入样例
- **题解部分**
- **完整代码**
- **未完待续**
- 参考文章
唤我沈七就行嘿嘿。
大一软件工程在读。
菜鸡蒟蒻想在博客中记录一些算法学习的心得体会,会持续更新C/C++方面的题解,方便理清思路和日后复习。如果还能结识一起敲代码的小伙伴的话就更好啦嘿嘿,因为笔者实在是太弱了,肯定免不了错误百出。
欢迎批评指正,期待共同成长!
题目链接
题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b](5≤a<b≤100,000,000) 一亿)间的所有回文质数。
输入样例
输入
5 500
输出
5
7
11
101
131
151
181
191
313
353
373
383
题解部分
涉及算法:数论、线性筛、回文数
针对线性筛我已经在上篇博客进行了详细讲解,建议读者在阅读下文题解之前在复习一遍。
算法模板:数论之质数全家桶(内含埃氏筛法,欧拉线性筛法模板)
思路
1.题目的亿级别的数据,说明暴力枚举,即试除法求素数,必然超时。这时我们的线性筛模板就派上了用场。
#define N 100000010
int cnt;//计数
int p[N];//存放质数
bool st[N];//用来筛掉合数,也可以用整型数组代替,1相当于true,0相当false
void get_prime(int n) {for(int i = 2; i <= n; i++) {if(!st[i]) p[cnt++] = i;for(int j = 0; p[j] <= n / i; j++) {//对于任意一个合数n,假设pj为n最小质因子,当i<=n/p[j]时,一定会被筛掉//因为i枚举到n之前,一定会枚举到n/p[j],而当n/p[j]不就是合数n的因子,//所以x一定会被在i<=n/p[j]时被筛除。st[p[j]*i] = true;if(i % p[j] == 0) break; }}
}
2 . 那回文数如何判断呢?
既然是回文数即正着读和倒着读一样,
那我们就把要判断的数倒置之后再和倒置之前的数判断是否相等,
若相等即为回文数。
int a,b,c;while(a1){b=a%10;c=c*10+b;a/=10;}if(c==p[i])printf("%d\n",p[i]);
3 .我们将前面提到的两点进行合并,即在指定区间用线性筛之后将质数存贮起来,在判断是否为回文数,整理成程序提交后,发现还是TLE(超时)了一个测试点。
要知道我们使用可是最快的线性筛,那怎么样进一步优化呢?
我们又需要用到一个新的知识点,
除了11以外,一个数的位数是偶数的话,不可能为回文数素数。
证明如果一个回文素数的位数是偶数,则它的奇数位上的数字和与偶数位上的数字和必然相等;根据数的整除性理论,容易判断这样的数肯定能被11整除,所以它就不可能是素数
.
有了这一结论,事情就变的简单了,我们只需要在判断小于8位数的数是否为素数即可。
做法是需要在线性筛判断上加一个特判。
void get_prime(int n)
{for( int i=2;i<=n;i++){if(i>10000000)continue;else{if(!a[i])p[t++]=i;for(int j=0;p[j]<=n/i;j++){a[i*p[j]]=true;if(i%p[j]==0)break;}} }
}
ok核心部分已经讲解完毕,下面奉上完整代码。
完整代码
C++版
#include<bits/stdc++.h>
#define N 100000010
using namespace std;
int p[N],t;
bool st[N];
void get_prime(int n)
{for( int i=2;i<=n;i++){if(i>10000000)continue;else{if(!st[i])p[t++]=i;for(int j=0;p[j]<=n/i;j++){st[i*p[j]]=true;if(i%p[j]==0)break;}} }
}
int main()
{int i,j;int m,n;int a,b,c=0;scanf("%d%d",&m,&n);get_prime(n);for(i=0;i<t;i++){ a=p[i];if(a<m)continue;c=0;while(a){b=a%10;c=c*10+b;a/=10;}if(c==p[i])printf("%d\n",p[i]);}return 0;
}
C语言版
#include<stdio.h>
#define N 100000010
int p[N],t;
int st[N];
void get_prime(int n)
{for( int i=2;i<=n;i++){if(i>10000000)continue;else{if(!st[i])p[t++]=i;for(int j=0;p[j]<=n/i;j++){st[i*p[j]]=1;if(i%p[j]==0)break;}} }
}
int main()
{int i,j;int m,n;int a,b,c=0;scanf("%d%d",&m,&n);get_prime(n);for(i=0;i<t;i++){ a=p[i];if(a<m)continue;c=0;while(a){b=a%10;c=c*10+b;a/=10;}if(c==p[i])printf("%d\n",p[i]);}return 0;
}
未完待续
孩子测试了一下C语言版的,发现将bool 型数组转换为int 数组来标记合数的话,在最后一个测试点内存会爆掉。
如果读者C语言版的代码有更好的解决方案的话,欢迎评论区讨论。
肯定回关哦,没有什么粉丝,只有学习伙伴,要是能有幸和你一起进步那就太棒啦.
参考文章
https://blog.csdn.net/m0_66139206/article/details/
C/C++实现回文质数(超详解)【沈七】相关推荐
- c语言:判断字符串是否为回文(超详解)
C语言运用数组读入字符串判断是否为回文 运行代码及解析 #include<stdio.h> int main(void) {int i,k;char c[20];printf(" ...
- 试题14 回文数(详解)
题目: 一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数.比如121,2332都是回文数,13,4567度不是回文数. 任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得 ...
- 用c语言求五位回文数,C语言求回文数(详解版)
问题描述 打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数). 问题分析 对于要判定的数n计算出其平方后(存于a),按照"回文数"的定义要将最高位与最低位 ...
- 【蓝桥杯】《试题 基础练习 特殊回文数》详解
一.问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n . 二.解题思路 1.解决该问题可采用暴力 ...
- c语言编写函数求回文数,C语言求回文数(详解版)
问题描述 打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数). 问题分析 对于要判定的数n计算出其平方后(存于a),按照"回文数"的定义要将最高位与最低位 ...
- 详解回文质数---洛谷1217---C语言
感谢李振阳学长的辛苦调试!!! 写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)( 一亿)间的所 ...
- P1217 回文质数(打表)
2020.2.9更新,修改打表程序,用上freopen("Table.txt", "w", stdout);程序更加简洁 题目描述 因为151既是一个质数又是一 ...
- 洛谷 - P1217 [USACO1.5]回文质数 Prime Palindromes(欧拉线性筛+数论小知识)
题目链接:点击查看 题目大意:给出一个a和b,求出区间[a,b]中所有回文质数,回文质数指的是一个数既是回文数也是质数 题目分析:首先质数好判断,我们只需要用欧拉筛预处理打好表即可,判断回文数我们也只 ...
- 洛谷P1217 回文质数
题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000 ...
最新文章
- lftp 4.4.0 发布,命令行的FTP工具
- 毒鸡汤真相,你被骗了多少年?
- python软件怎么用-如何使用Python编写一个桌面软件系统?步骤有哪些
- gparted 不能起作用的时候,用fdisk
- MySQL浮点数和定点数类型
- 我的JMX心得 -- Server端
- bootstrap datetimepicker 复选可删除,可规定指定日期不可选
- 京东:妥善处理个别显卡售后的问题 不存在“金融化”情况
- JavaScript学习(五十三)—借用构造方法继承
- linux 路由跟踪命令_一文掌握linux系统路由跟踪指令traceroute
- Apache Tomcat 安装配置图文详细教程
- 《白帽子讲web安全》第一篇 世界观安全
- 二维拉普拉斯方程的数值解法
- Topic 15. 临床预测模型之决策曲线 (DCA)
- UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析
- 数据结构与算法之美笔记-链表(Linked list)
- 2020春招 / 2021秋招阿里、腾讯、字节、快手、美团 JAVA 开发岗面试高频问题总结
- 第十七届“振兴杯”全国青年 职业技能大赛——计算机程序设计员(云计算平台与运维)参赛回顾与总结
- R语言统计分析之方差分析
- java中空指针异常如何解决_main函数中出现空指针异常,如何解决?
热门文章
- 【JAVA】String源码浅谈
- html.gmt文件,基于格林威治标准时间(GMT)的jQuery模拟时钟插件
- 40系笔记本(可不联网激活)深度学习生产力(环境配置和简单训练测试)
- Swiper插件之Animate动画
- [Repeater]三个事件的执行先后?ItemDataBound / ItemCreated / ItemCommand
- 社群运营能怎么做好?
- 描述性统计图表——散点图
- 服务器增加显卡 电压,疯狂改造!教你给PCI-E插槽加电压
- CDR插件开发之CPG插件003 - 使用VS2019编译CDR类型库 VGCoreAuto.tlb
- WPF中报错:“未将对象引用设置到对象的实例。”