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++实现回文质数(超详解)【沈七】相关推荐

  1. c语言:判断字符串是否为回文(超详解)

    C语言运用数组读入字符串判断是否为回文 运行代码及解析 #include<stdio.h> int main(void) {int i,k;char c[20];printf(" ...

  2. 试题14 回文数(详解)

    题目: 一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数.比如121,2332都是回文数,13,4567度不是回文数. 任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得 ...

  3. 用c语言求五位回文数,C语言求回文数(详解版)

    问题描述 打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数). 问题分析 对于要判定的数n计算出其平方后(存于a),按照"回文数"的定义要将最高位与最低位 ...

  4. 【蓝桥杯】《试题 基础练习 特殊回文数》详解

    一.问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n . 二.解题思路 1.解决该问题可采用暴力 ...

  5. c语言编写函数求回文数,C语言求回文数(详解版)

    问题描述 打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数). 问题分析 对于要判定的数n计算出其平方后(存于a),按照"回文数"的定义要将最高位与最低位 ...

  6. 详解回文质数---洛谷1217---C语言

    感谢李振阳学长的辛苦调试!!! 写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)( 一亿)间的所 ...

  7. P1217 回文质数(打表)

    2020.2.9更新,修改打表程序,用上freopen("Table.txt", "w", stdout);程序更加简洁 题目描述 因为151既是一个质数又是一 ...

  8. 洛谷 - P1217 [USACO1.5]回文质数 Prime Palindromes(欧拉线性筛+数论小知识)

    题目链接:点击查看 题目大意:给出一个a和b,求出区间[a,b]中所有回文质数,回文质数指的是一个数既是回文数也是质数 题目分析:首先质数好判断,我们只需要用欧拉筛预处理打好表即可,判断回文数我们也只 ...

  9. 洛谷P1217 回文质数

    题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000 ...

最新文章

  1. lftp 4.4.0 发布,命令行的FTP工具
  2. 毒鸡汤真相,你被骗了多少年?
  3. python软件怎么用-如何使用Python编写一个桌面软件系统?步骤有哪些
  4. gparted 不能起作用的时候,用fdisk
  5. MySQL浮点数和定点数类型
  6. 我的JMX心得 -- Server端
  7. bootstrap datetimepicker 复选可删除,可规定指定日期不可选
  8. 京东:妥善处理个别显卡售后的问题 不存在“金融化”情况
  9. JavaScript学习(五十三)—借用构造方法继承
  10. linux 路由跟踪命令_一文掌握linux系统路由跟踪指令traceroute
  11. Apache Tomcat 安装配置图文详细教程
  12. 《白帽子讲web安全》第一篇 世界观安全
  13. 二维拉普拉斯方程的数值解法
  14. Topic 15. 临床预测模型之决策曲线 (DCA)
  15. UESTC论坛-清水河畔自动登陆/重复发贴/安全性分析
  16. 数据结构与算法之美笔记-链表(Linked list)
  17. 2020春招 / 2021秋招阿里、腾讯、字节、快手、美团 JAVA 开发岗面试高频问题总结
  18. 第十七届“振兴杯”全国青年 职业技能大赛——计算机程序设计员(云计算平台与运维)参赛回顾与总结
  19. R语言统计分析之方差分析
  20. java中空指针异常如何解决_main函数中出现空指针异常,如何解决?

热门文章

  1. 【JAVA】String源码浅谈
  2. html.gmt文件,基于格林威治标准时间(GMT)的jQuery模拟时钟插件
  3. 40系笔记本(可不联网激活)深度学习生产力(环境配置和简单训练测试)
  4. Swiper插件之Animate动画
  5. [Repeater]三个事件的执行先后?ItemDataBound / ItemCreated / ItemCommand
  6. 社群运营能怎么做好?
  7. 描述性统计图表——散点图
  8. 服务器增加显卡 电压,疯狂改造!教你给PCI-E插槽加电压
  9. CDR插件开发之CPG插件003 - 使用VS2019编译CDR类型库 VGCoreAuto.tlb
  10. WPF中报错:“未将对象引用设置到对象的实例。”