[原创][luogu]P1217 回文质数 真·生成回文的方法
不多说,直接看代码,都在注释里
// 中心思想:
// * 1. 代入数据只想回文的一半和位数的变化
// * 例. 1001 和 101 都存的是10, 但是位数一个是4, 一个是3
// * 2. 安装只存一半的思想,进位时是从中心进位
// * 例. 1001 => 1111, 101 => 111
// * 例. 99 => 101, 999 => 1001
// * 3. 进位时存储的方式
// * 例. 偶数进位后是奇数位的情况 (实际数字:9999 | 存储数字:99 | 位数:4) => (实际数字:10001 | 存储数字:100 | 位数:5)
// * 例. 奇数进位后是偶数位的情况 (实际数字:99999 | 存储数字:999 | 位数:5) => (实际数字:100001 | 存储数字:100 | 位数:6)
// * 例. 虽然都是进位,但是进位后的数字奇数时存储数字会进一位,偶数时不会进位
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
// 回文结构体
struct hui {
int w; // 位数
int n; // 回文的一半 奇数是w/2+1位 偶数是w/2位 如 1001为10, 101还是为 10
};
// 双重循环判质数,基础算法,就不注释了
// 有人特判二的倍数,但是我觉得不必要,进循环第一个试的就是2,时间复杂度没差多少
bool isZ(int n) {
if(n <= 1) {
return false;
}
for(int i=2; i*i<=n; i++) {
if(n%i==0) {
return false;
}
}
return true;
}
// 获取参数x之后的第一个回文数
hui getFirst(int x) {
// 初始化
int a[10] = {}; // 存每一位的数组
hui t; // 要返回的回文数结构体
// log10求位数 注意!!! log10返回浮点数!!!
t.w = log10(x)+1;
// 考虑顺序地拆解每一位 例如: 10是[1, 0]不是[0, 1]
for(int i=1; i<=t.w; i++) {
a[t.w-i] = x%10;
x /= 10;
}
// 这里是重点!!!
// 开始之前,先解释一串表达式 t.w/2-1+(t.w&1)
// 这串表达式是找到回文的中心,偶数是靠前一点的中心
// 位数除以二是找到中心,减一是适配数组从0开始,(t.w&1)是用位运算判断奇偶,奇数就返回1,偶数返回0,可以带入几个数试试
int i, j;
// 开始
i = 0;
// 结尾
j = t.w - 1;
// 左右两边向中心走(什么双指针之类的
while(i<j) {
// 重点中的核心!!!
// 如果右边的回文数比左边的大就让左边进一
// 例如 23042 出来的是 23100 不是24042!
// 13出来的是20 不是33!
// 因为结构体只存回文的一半, 所以只搞好一半就行
if(a[i] < a[j]) {
a[t.w/2-1+(t.w&1)]++;
break;
}
i++;
j--;
}
// 搞好数组了就要存入结构体,例如 1001 存 10, 100001存 100,存一半 (10001也是存10但是它们结构体里位数不一样
t.n = 0;
for(i = 0; i<t.w/2+(t.w&1); i++) {
t.n *= 10;
t.n += a[i];
}
return t;
}
// 下一个回文数
// 这个函数就是找规律
void nextHui(hui& x) {
int y = x.n;
x.n++;
// 是否进位
// 看文章开头的中心思想
if(int(log10(x.n))+1 != int(log10(y))+1) {
if(x.w&1) {
x.n /= 10;
}
x.w++;
}
}
// 结构体转int
int toInt(hui x) {
int s = x.n;
int t = x.n;
if(x.w&1) {
t /= 10;
}
while(t!=0) {
s *= 10;
s += t%10;
t /= 10;
}
return s;
}
int main() {
int start, end;
cin >> start >> end;
hui x;
x = getFirst(start);
// 没到就枚举
while(toInt(x) <= end) {
// 判断质数
if(isZ(toInt(x))) {
cout << toInt(x) << endl;
}
// 下一个回文数
nextHui(x);
}
return 0;
}
真的写了很久,题目更是写了一天请帮忙点个赞,这对我帮助很大
[原创][luogu]P1217 回文质数 真·生成回文的方法的更多相关文章
- PowerDesigner(九)-模型文档编辑器(生成项目文档)(转)
模型文档编辑器 PowerDesigner的模型文档(Model Report)是基于模型的,面向项目的概览文档,提供了灵活,丰富的模型文档编辑界面,实现了设计,修改和输出模型文档的全过程. 模型文 ...
- 黄聪:利用OpenXml生成Word2007文档(转)
原文:http://blog.csdn.net/francislaw/article/details/7568317 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一Op ...
- 利用OpenXml生成Word2007文档
一.OpenXml简介 利用C#生成Word文档并非一定要利用OpenXml技术,至少可以使用微软提供的Office相关组件来编程,不过对于Office2007(确切的说是Word.Excel和Pow ...
- Python sphinx-build在Windows系统中生成Html文档
看到前同事发布的“Markdown/reST 文档发布流水线”基于TFS.Docker.Azure等工具和平台进行文档发布的介绍说明,不得不在心中暗暗竖起大拇指.这套模式,实现了文档编写后版本管理.发 ...
- 【Lua】LDoc生成Lua文档工具的使用
参考资料: http://my.oschina.net/wangxuanyihaha/blog/188909 LDoc介绍: LDoc是一个Lua的文档生成工具,过去,比较常用的Lua生成 ...
- Spring Boot 2.x基础教程:Swagger静态文档的生成
前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了.如果您还不熟悉这块,可以先阅读: Spring Boo ...
- SpringBoot2中,怎么生成静态文档
SpringBoot2中,怎么生成静态文档 在实际开发过程中,我们通过swagger就可以生成我们的接口文档,这个文档就可以提供给前端人员开发使用的.但是,有时候,我们需要把我们的接口文档,提供给第三 ...
- luogu P1217 [USACO1.5]回文质数 Prime Palindromes x
P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...
- 洛谷 P1217 回文质数
洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...
- P1217 [USACO1.5]回文质数 Prime Palindromes(求100000000内的回文素数)
P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...
随机推荐
- Ubuntu linux下gcc、g++不同版本的安装和切换
讲解linux下gcc.g++不同版本的安装和切换 Ubuntu 18.04预装GCC版本为7.3,但有时在编译是需要用的不同gcc版本,下面介绍,如何安装不同的gcc 和g++,并设置根据不同的需要 ...
- 【已解决】robotframework 连接oracle数据库返回结果中文显示乱码
问题描述:查询数据库返回信息有中文的时候会显示unicode的样式,如图: 环境:robotframework 3.0.x 解决方法: 找到Python安装目录下的\Lib\site-packages ...
- android studio真垃圾
开发人员写代码就行了,想用你写代码,安装配置费死个劲! 我不是针对你,除了visual studio ,所有的IDE都是垃圾.
- 论MVC架构设计及其应用
论MVC架构设计及其应用 张紫诺1 (1. 位石家庄铁道大学,河北 石家庄 050000) 摘要:随着信息化建设的发展,人们愈发需要考虑采用一种良好的架构实现快速构建企业应用程序的目标.而MVC架构正 ...
- requests模块之post请求传参json和data区别
post请求参数到底是传data还是json,此时要看请求头里的content-type类型 请求头中content-type为application/json, 为json形式,post请求使用js ...
- 基础篇:windows常用命令
1. windows常用系统命令 cd [进入目录] dir [列出当前目录文件] echo + 打印内容 [打印命令] echo 123 > 1.txt [打印内容到文本] type + 文件 ...
- cmake 实现交叉编译注意事项
(1)确保安装交叉编译工具安装成功 在终端输入arm-linux-gnueabihf-g++ -v 或 arm-linux-gnueabihf-gcc -v ,能看到相应交叉C编译器和C++编译器的版 ...
- ADB 命令 使用
基本用法 命令语法 为命令指定目标设备 启动/停止 查看 adb 版本 以 root 权限运行 adbd 指定 adb server 的网络端口 设备连接管理 查询已连接设备/模拟器 USB 连接 无 ...
- vue-cli简介
1.定义:vue-cli(俗称:vue 脚手架)是 vue 官方提供的.快速生成 vue 工程化项目的工具,提供了终端里的 vue 命令.它可以通过 vue create 快速搭建一个新项目: 特点: ...
- nRF52832起来之后测试是上电还是休眠唤醒的方法
void fu_state_machine_init(void) { /* NRF_POWER_RESETREAS_SREQ_MASK JLINK DOWNLOAD / POWER ON can ca ...