P1015 [NOIP 1999 普及组] 回文数
记录141#includebits/stdc.h using namespace std; int n; // 进制数 N int a[200],len; // a数组用来倒序存储大数len记录当前大数的长度 // 判断当前数组 a 是否是回文数 bool f(){ for(int i0;ilen/2;i){ if(a[i]!a[len-1-i]) return false; } return true; } // 高精度 N 进制加法将数组 a 与它的倒序相加 void add(){ int b[200]; // 用来存 a 的倒序 // 1. 先把 a 倒序存入 b for(int i0;ilen;i) b[i]a[len-1-i]; // 2. 模拟竖式加法 for(int i0;ilen;i){ a[i]b[i]; // 对应位相加 a[i1]a[i]/n; // 处理进位 a[i]%n; // 保留当前位的余数 } // 3. 如果最高位产生了进位长度要加1 if(a[len]0) len; } int main(){ // 主函数入口 ios::sync_with_stdio(false); // 关闭同步加速IO cin.tie(0); string s; // 用来读入初始的 N 进制数 M cinns; // 将字符串倒序转换成数字存入数组 a方便从个位开始加 lens.size(); for(int i0;ilen;i){ char cs[len-1-i]; // 倒着取字符 if(c0c9) a[i]c-0; // 数字字符转数字 else a[i]c-A10; // 字母 A-F 转 10-15 } int step0; // 记录步数 while(step30){ if(f()){ // 如果已经是回文数 coutSTEPstep\n; return 0; // 直接结束程序 } add(); // 执行一次高精度加法 step; // 步数加1 } // 如果循环跑完30步还没找到 coutImpossible!\n; return 0; }题目传送门https://www.luogu.com.cn/problem/P1015前言我是一名专注信奥赛CSP-J/S、NOIP的教练。如果你觉得这篇题解对你有帮助欢迎点击关注我的CSDN账号我会持续更新高质量算法解析。我深知算法思维的构建远比单纯通过题目更重要本系列题解不局限于AC代码的堆砌而是致力于拆解题目背后的逻辑链条与核心知识点备赛路上若遇瓶颈欢迎随时评论或私信我将甄选典型疑难问题通过视频讲解或撰写专项文章的形式为你提供深度答疑。核心解题思路这道题是一道非常经典的高精度运算与字符串处理结合的问题。数据规模分析题目中给出的 N 进制数 M 长度不超过 100 位。在 C 等语言中普通的整数类型如long long最多只能存储 19 位左右的十进制数。因此我们必须使用高精度算法即用数组来模拟大数的每一位进行运算。算法设计高精度加法 模拟题目要求我们不断执行“将当前数与其倒序数相加”的操作直到结果变为回文数。我们可以按照以下步骤模拟数据存储将输入的字符串倒序存入一个整型数组中数组下标 0 对应个位方便处理进位。回文判定每次加法前检查当前数组表示的数是否是回文数。高精度 N 进制加法模拟竖式加法将数组与它的倒序对应位相加并处理 N 进制的进位。步数限制题目限制最多 30 步如果超过 30 步仍未得到回文数则输出Impossible!。代码分块详细解释1. 头文件、全局变量与回文判定函数#includebits/stdc.h using namespace std; int n; // 进制数 N int a[200], len; // a数组用来倒序存储大数len记录当前大数的长度 // 判断当前数组 a 是否是回文数 bool f(){ for(int i0; ilen/2; i){ if(a[i] ! a[len-1-i]) return false; } return true; }详细分析a[200]是高精度运算的核心容器因为初始长度最多 100 位经过最多 30 次加法后长度翻倍也远小于 200所以数组大小足够。f()函数通过双指针思想从数组的两端向中间遍历只要有一对对应位置的数字不相等就说明不是回文数。2. 核心逻辑高精度 N 进制加法// 高精度 N 进制加法将数组 a 与它的倒序相加 void add(){ int b[200]; // 用来存 a 的倒序 // 1. 先把 a 倒序存入 b for(int i0; ilen; i) b[i] a[len-1-i]; // 2. 模拟竖式加法 for(int i0; ilen; i){ a[i] b[i]; // 对应位相加 a[i1] a[i] / n; // 处理进位除以进制数 n a[i] % n; // 保留当前位的余数对进制数 n 取模 } // 3. 如果最高位产生了进位长度要加1 if(a[len] 0) len; }详细分析这是本题最核心的部分。倒序备份由于我们要将a和它的倒序相加而a本身在加法过程中会被修改所以必须先用一个临时数组b把a的倒序存起来。竖式加法与进位从个位下标 0开始将a[i]和b[i]相加。因为是 N 进制所以满 N 就要进 1。a[i] / n得到进位的值加到下一位a[i1]上a[i] % n得到当前位保留的数字。长度更新如果最高位a[len-1]相加后产生了进位这个进位会落在a[len]上此时大数的实际长度就需要增加 1。3. 主函数输入处理与倒序转换int main(){ ios::sync_with_stdio(false); cin.tie(0); string s; // 用来读入初始的 N 进制数 M cin n s; // 将字符串倒序转换成数字存入数组 a方便从个位开始加 len s.size(); for(int i0; ilen; i){ char c s[len-1-i]; // 倒着取字符 if(c 0 c 9) a[i] c - 0; // 数字字符转数字 else a[i] c - A 10; // 字母 A-F 转 10-15 }详细分析由于输入的数可能包含字母如 16 进制中的 A-F且长度很长必须用string读入。为了符合人类做竖式加法的习惯从个位开始算我们将字符串倒序存入数组a。例如输入 87a[0]存 7a[1]存 8。同时通过 ASCII 码的运算将字符完美转换为对应的十进制数值。4. 主循环模拟步进与结果输出int step 0; // 记录步数 while(step 30){ if(f()){ // 如果已经是回文数 cout STEP step \n; return 0; // 直接结束程序 } add(); // 执行一次高精度加法 step; // 步数加1 } // 如果循环跑完30步还没找到 cout Impossible!\n; return 0; }详细分析这里采用了while循环来模拟题目要求的操作步骤。每次循环开始时先判断当前数是否已经是回文数注意初始输入的数本身可能就是回文数此时步数为 0。如果不是就调用add()执行一次加法并将步数加 1。如果循环正常结束即step超过了 30说明在限制步数内无法得到回文数输出Impossible!。核心逻辑总结表代码模块核心变量/操作精炼作用解决的痛点高精度存储int a[200]用整型数组倒序存储大数突破了普通整数类型的位数限制能够处理 100 位以上的超大数字符转换c-0与c-A10将 N 进制字符转换为对应数值完美兼容了 2-10 进制以及 16 进制包含字母的输入回文判定f()函数双指针比对数组两端快速判断当前高精度数是否满足题目要求的终止条件竖式加法a[i1] a[i]/n模拟 N 进制的进位操作实现了任意进制下的大数加法是本题的核心算法动态长度if(a[len]0) len处理最高位进位导致的长度增加保证了在多次加法后数组的有效长度始终是正确的步数模拟while(step30)限制最大操作次数并模拟过程严格按照题目要求在 30 步内寻找答案或判定无解

相关新闻

从零构建生产级 RAG 系统:Chunking 策略、向量检索、重排序与 RAGAS 评估的全链路实战

从零构建生产级 RAG 系统:Chunking 策略、向量检索、重排序与 RAGAS 评估的全链路实战

从零构建生产级 RAG 系统:Chunking 策略、向量检索、重排序与 RAGAS 评估的全链路实战 核心痛点:RAG 教程遍地都是,但从零搭建真正可用的生产级 RAG 缺少完整实操指南。适配人群:有 Python 基础的 AI 应用开发者、RAG 系统后端工程师、ML 工程师。收获能力:独立搭建可运行…

2026/7/10 22:28:34阅读更多 →
7月22日三星Galaxy Unpacked发布会官宣,或推新形态折叠屏手机及多款新品

7月22日三星Galaxy Unpacked发布会官宣,或推新形态折叠屏手机及多款新品

三星官宣7月22日发布会,新形态折叠屏手机呼之欲出三星宣布下一场Galaxy Unpacked新品发布会将于7月22日在英国伦敦举行,宣传语为“新形态,新展开”。长期以来的传言称三星准备扩展折叠屏手机产品线到第三种形态,推出大书本式折叠屏…

2026/7/10 22:28:34阅读更多 →
AI模型选型避坑指南:如何平衡模型能力与工具链成熟度

AI模型选型避坑指南:如何平衡模型能力与工具链成熟度

最近在AI圈有个现象越来越明显:很多新发布的模型在技术指标上表现亮眼,但在实际开发使用中却让人头疼。这背后反映了一个关键问题——模型能力与工具链成熟度之间的脱节。作为一名长期关注AI工程化的开发者,我发现很多团队在选型时过于关注模…

2026/7/10 22:28:34阅读更多 →
专业排版还原实战:如何解决Grok到word的格式问题?解析数据结构化迁移及“AI 导出鸭”工具的价值

专业排版还原实战:如何解决Grok到word的格式问题?解析数据结构化迁移及“AI 导出鸭”工具的价值

一 AI 导出鸭技术详解:如何解决Grok到word的格式问题 二 如何解决Grok到word的格式问题?硬核方案与AI 导出鸭实践 三 从乱码到规范:借助AI 导出鸭攻克如何解决Grok到word的格式问题正文:深入解析Grok到Word的格式转换困局与智能解…

2026/7/10 23:23:41阅读更多 →
Docker Compose 到 K8s 的迁移路径:不是一键转换那么简单

Docker Compose 到 K8s 的迁移路径:不是一键转换那么简单

Docker Compose 到 K8s 的迁移路径:不是一键转换那么简单 一、Kompose 转换完的 YAML 也别直接部署 Docker Compose 和 K8s 之间的概念鸿沟远超表面相似度。Kompose(kompose convert)能生成初版 YAML,但它只是一个语法翻译器——不…

2026/7/10 23:23:41阅读更多 →
手把手教你学 Simulink——基于双重移相(Dual Phase Shift, DPS)控制的双主动全桥(DAB)DC‑DC 最小电流应力控制仿真

手把手教你学 Simulink——基于双重移相(Dual Phase Shift, DPS)控制的双主动全桥(DAB)DC‑DC 最小电流应力控制仿真

目录 手把手教你学 Simulink——基于双重移相(Dual Phase Shift, DPS)控制的双主动全桥(DAB)DC‑DC 最小电流应力控制仿真 一、为什么 DAB 要用 双重移相 + 最小电流应力(Minimum Current Stress, MCS)控制 1.1 DAB 典型应用 1.2 单重移相(SPS)问题 二、DAB 拓扑与…

2026/7/10 23:23:41阅读更多 →
Qt + FFmpeg 音频工具:媒体流详情实现

Qt + FFmpeg 音频工具:媒体流详情实现

前言 音视频文件在容器层面由一个或多个流(stream)组成,每个流拥有独立的编码格式、参数配置和元数据。了解这些流的详细信息对于后续处理决策至关重要——比如判断音频是否需要重采样、视频帧率是否匹配、色彩空间是否正确等。AudioTools 的…

2026/7/10 23:23:41阅读更多 →
一个简单的 Oracle SPA示例

一个简单的 Oracle SPA示例

简介 本文通过一个示例来说明如何进行SPA。 SPA即SQL Performance Analyzer,按照官网的说明: SQL Performance Analyzer enables you to assess the impact of system changes on the response time of SQL statements. SQL性能分析器(SQL …

2026/7/10 23:23:41阅读更多 →
计网物理层基本概念

计网物理层基本概念

物理层是五层协议体系中的最底层,它的任务极其单纯:把比特流从一个节点透明地传送到相邻节点。物理层关心的不是"数据是什么意思",而是:用什么样的电压表示 1 和 0?一个比特持续多长时间?要不要区…

2026/7/10 23:18:41阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/10 12:10:00阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/10 12:29:21阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/10 4:59:05阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时,背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制,而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述:这不是又一个机器人抓取数据集,而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号:“Robo”直指物理世界中的具身智能体,“Wits”则毫不掩饰地指向人类最核心的认知能力:机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/10 13:39:09阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/10 22:20:33阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/10 17:29:22阅读更多 →