不多说,直接看代码,都在注释里

  1. // 中心思想:
  2. // * 1. 代入数据只想回文的一半和位数的变化
  3. // * 例. 1001 和 101 都存的是10, 但是位数一个是4, 一个是3
  4. // * 2. 安装只存一半的思想,进位时是从中心进位
  5. // * 例. 1001 => 1111, 101 => 111
  6. // * 例. 99 => 101, 999 => 1001
  7. // * 3. 进位时存储的方式
  8. // * 例. 偶数进位后是奇数位的情况 (实际数字:9999 | 存储数字:99 | 位数:4) => (实际数字:10001 | 存储数字:100 | 位数:5)
  9. // * 例. 奇数进位后是偶数位的情况 (实际数字:99999 | 存储数字:999 | 位数:5) => (实际数字:100001 | 存储数字:100 | 位数:6)
  10. // * 例. 虽然都是进位,但是进位后的数字奇数时存储数字会进一位,偶数时不会进位
  11. #include <iostream>
  12. #include <cstdio>
  13. #include <cmath>
  14. #include <algorithm>
  15. using namespace std;
  16. // 回文结构体
  17. struct hui {
  18. int w; // 位数
  19. int n; // 回文的一半 奇数是w/2+1位 偶数是w/2位 如 1001为10, 101还是为 10
  20. };
  21. // 双重循环判质数,基础算法,就不注释了
  22. // 有人特判二的倍数,但是我觉得不必要,进循环第一个试的就是2,时间复杂度没差多少
  23. bool isZ(int n) {
  24. if(n <= 1) {
  25. return false;
  26. }
  27. for(int i=2; i*i<=n; i++) {
  28. if(n%i==0) {
  29. return false;
  30. }
  31. }
  32. return true;
  33. }
  34. // 获取参数x之后的第一个回文数
  35. hui getFirst(int x) {
  36. // 初始化
  37. int a[10] = {}; // 存每一位的数组
  38. hui t; // 要返回的回文数结构体
  39. // log10求位数 注意!!! log10返回浮点数!!!
  40. t.w = log10(x)+1;
  41. // 考虑顺序地拆解每一位 例如: 10是[1, 0]不是[0, 1]
  42. for(int i=1; i<=t.w; i++) {
  43. a[t.w-i] = x%10;
  44. x /= 10;
  45. }
  46. // 这里是重点!!!
  47. // 开始之前,先解释一串表达式 t.w/2-1+(t.w&1)
  48. // 这串表达式是找到回文的中心,偶数是靠前一点的中心
  49. // 位数除以二是找到中心,减一是适配数组从0开始,(t.w&1)是用位运算判断奇偶,奇数就返回1,偶数返回0,可以带入几个数试试
  50. int i, j;
  51. // 开始
  52. i = 0;
  53. // 结尾
  54. j = t.w - 1;
  55. // 左右两边向中心走(什么双指针之类的
  56. while(i<j) {
  57. // 重点中的核心!!!
  58. // 如果右边的回文数比左边的大就让左边进一
  59. // 例如 23042 出来的是 23100 不是24042!
  60. // 13出来的是20 不是33!
  61. // 因为结构体只存回文的一半, 所以只搞好一半就行
  62. if(a[i] < a[j]) {
  63. a[t.w/2-1+(t.w&1)]++;
  64. break;
  65. }
  66. i++;
  67. j--;
  68. }
  69. // 搞好数组了就要存入结构体,例如 1001 存 10, 100001存 100,存一半 (10001也是存10但是它们结构体里位数不一样
  70. t.n = 0;
  71. for(i = 0; i<t.w/2+(t.w&1); i++) {
  72. t.n *= 10;
  73. t.n += a[i];
  74. }
  75. return t;
  76. }
  77. // 下一个回文数
  78. // 这个函数就是找规律
  79. void nextHui(hui& x) {
  80. int y = x.n;
  81. x.n++;
  82. // 是否进位
  83. // 看文章开头的中心思想
  84. if(int(log10(x.n))+1 != int(log10(y))+1) {
  85. if(x.w&1) {
  86. x.n /= 10;
  87. }
  88. x.w++;
  89. }
  90. }
  91. // 结构体转int
  92. int toInt(hui x) {
  93. int s = x.n;
  94. int t = x.n;
  95. if(x.w&1) {
  96. t /= 10;
  97. }
  98. while(t!=0) {
  99. s *= 10;
  100. s += t%10;
  101. t /= 10;
  102. }
  103. return s;
  104. }
  105. int main() {
  106. int start, end;
  107. cin >> start >> end;
  108. hui x;
  109. x = getFirst(start);
  110. // 没到就枚举
  111. while(toInt(x) <= end) {
  112. // 判断质数
  113. if(isZ(toInt(x))) {
  114. cout << toInt(x) << endl;
  115. }
  116. // 下一个回文数
  117. nextHui(x);
  118. }
  119. return 0;
  120. }

真的写了很久,题目更是写了一天请帮忙点个赞,这对我帮助很大

[原创][luogu]P1217 回文质数 真·生成回文的方法的更多相关文章

  1. PowerDesigner(九)-模型文档编辑器(生成项目文档)(转)

    模型文档编辑器 PowerDesigner的模型文档(Model  Report)是基于模型的,面向项目的概览文档,提供了灵活,丰富的模型文档编辑界面,实现了设计,修改和输出模型文档的全过程. 模型文 ...

  2. 黄聪:利用OpenXml生成Word2007文档(转)

    原文:http://blog.csdn.net/francislaw/article/details/7568317 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一Op ...

  3. 利用OpenXml生成Word2007文档

    一.OpenXml简介 利用C#生成Word文档并非一定要利用OpenXml技术,至少可以使用微软提供的Office相关组件来编程,不过对于Office2007(确切的说是Word.Excel和Pow ...

  4. Python sphinx-build在Windows系统中生成Html文档

    看到前同事发布的“Markdown/reST 文档发布流水线”基于TFS.Docker.Azure等工具和平台进行文档发布的介绍说明,不得不在心中暗暗竖起大拇指.这套模式,实现了文档编写后版本管理.发 ...

  5. 【Lua】LDoc生成Lua文档工具的使用

    参考资料: http://my.oschina.net/wangxuanyihaha/blog/188909   LDoc介绍:     LDoc是一个Lua的文档生成工具,过去,比较常用的Lua生成 ...

  6. Spring Boot 2.x基础教程:Swagger静态文档的生成

    前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了.如果您还不熟悉这块,可以先阅读: Spring Boo ...

  7. SpringBoot2中,怎么生成静态文档

    SpringBoot2中,怎么生成静态文档 在实际开发过程中,我们通过swagger就可以生成我们的接口文档,这个文档就可以提供给前端人员开发使用的.但是,有时候,我们需要把我们的接口文档,提供给第三 ...

  8. luogu P1217 [USACO1.5]回文质数 Prime Palindromes x

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

  9. 洛谷 P1217 回文质数

    洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...

  10. P1217 [USACO1.5]回文质数 Prime Palindromes(求100000000内的回文素数)

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

随机推荐

  1. react-signature-canvas 签名功能

    基于移动端需要扫码签名的功能,这里记录一下. 1.使用 react-signature-canvas 插件,npm i react-signature-canvas --save 2.此功能签名后生成 ...

  2. uniapp+vue3+ts

    1. 创建vue3的默认uniapp模板 2. npm init 创建package.json

  3. svn批量的添加ignore

    svn没有批量添加ignore file的功能,只能一个个目录去设置,故写了脚本自动化的执行 使用了svn propset,故改了ignore file,可以反复的执行此脚本 #!/usr/bin/p ...

  4. C++中,get getline gets 用法

    1.cin 2.cin.get() 3.cin.getline() 4.getline() 5.gets() 6.getchar() 1.cin>> 用法1:最基本,也是最常用的用法,输入 ...

  5. c++ 构造名字不足的0补齐

    stringstream ss; ss << setfill('0') << setw(10) << i; vstrImageFilenames[i] = strP ...

  6. linux 离线安装jdk

    系统版本:centos7.8 | jdk版本:1.8 jdk版本:jdk-8u5-linux-x64.rpm 点击下载 提取码: ud1r 检查系统是否已经有JDK,输入如下命令查看是否系统中是否已安 ...

  7. 4vue 属性绑定

    属性绑定v-bind <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. JVM-创建一个对象的详细过程

    Person person=new Person(): 1.现在栈中申请一个自己的栈空间 2.类加载检查 每当使用new操作符创建一个对象时,类加载器都会从常量池中寻找该对象的符号引用,如果找到,则根 ...

  9. vue项目部署后页面加载首次很慢的优化方案

    参考: vue项目首次加载特别慢需要怎么配置? 1.看看你的依赖包是不是全局引入的,改为组件内按需引入,可大大降低加载时长.或者将组件引入方式改为cdn引入.需要注意的是,两种引入方式不能共存. 2. ...

  10. k8s介绍和学习思路

    1. Kubernetes介绍 Kubernetes是一个完备的分布式系统支撑平台.具备完备的集群管理能力,包括多层次的安全防护和准入机制.多租户应用支撑能力.透明的服务注册和服务发现机制.内建的智能 ...