每日c/c++题 备战蓝桥杯(洛谷P1015 [NOIP 1999 普及组] 回文数)

洛谷P1015 [NOIP 1999 普及组] 回文数 题解

题目描述

P1015 回文数 是NOIP 1999普及组的经典模拟题。题目要求如下:

给定一个数N(十进制)和进制K(2≤K≤16),将N转换为K进制表示后,通过以下操作使其变为回文数:

  1. 将当前数与其逆序数相加
  2. 重复操作直到得到回文数或超过30次操作

输入格式

  • 第一行输入进制K(2≤K≤16)
  • 第二行输入十进制数N(1<N≤1e9)

输出格式

  • 若30步内得到回文数,输出STEP=步数
  • 否则输出Impossible!

解题思路

本题是典型的进制转换+模拟操作问题,核心在于:

  1. 正确实现大数的K进制转换
  2. 高效处理大数加法与进位
  3. 准确判断回文数

关键算法步骤

  1. 进制转换:将十进制数N转换为K进制表示
  2. 回文判断:检查当前数是否为回文
  3. 加法模拟:实现大数与其逆序数的加法运算
  4. 进位处理:处理不同进制下的进位逻辑

代码解析(附用户代码讲解)

以下是用户提供的代码的逐层解析:

#include<bits/stdc++.h>
#include<string>
using namespace std;int N;          // 目标进制
int step = 0;   // 操作步数
int len = 0;    // 当前数位长度
int ans[205] = {0};  // 存储K进制数(低位在前)
int tem[205] = {0};  // 临时反转数组
int re[205] = {0};   // 未使用(可忽略)// 回文数检查函数
int Check() {for(int i=0; i<len/2; ++i) {if(ans[i] != ans[len-i-1]) return -1;}return 1;
}// 加法操作函数
void play() {// 反转数组到temfor(int i=0; i<len; ++i) tem[i] = ans[len-i-1];// 执行加法for(int i=0; i<len; ++i) ans[i] += tem[i];// 进位处理for(int i=0; i<len; ++i) {if(N != 16) {  // 非16进制通用处理if(ans[len-1] >= N) len++;ans[i+1] += ans[i] / N;ans[i] %= N;} else {        // 16进制特殊处理if(ans[len-1] >= 16) len++;ans[i+1] += ans[i] / 16;ans[i] %= 16;}}
}int main() {ios::sync_with_stdio(false);cin.tie(0);string s;cin >> N >> s;len = s.length();// 初始化K进制数(注意低位存储方式)for(int i=0; i<len; ++i) {if(isdigit(s[len-i-1]))ans[i] = s[len-i-1] - '0';elseans[i] = s[len-i-1] - 'A' + 10;}if(Check() == 1) {  // 初始即为回文cout << "STEP=0";} else {while(step <= 30) {play();step++;if(Check() == 1) break;}if(step <= 30)cout << "STEP=" << step;elsecout << "Impossible!";}return 0;
}

代码特点分析

  1. 低位优先存储:使用数组ans[]的低位在前方式存储,简化进位操作
  2. 双模式进位处理:通过N != 16判断统一处理不同进制
  3. 动态长度维护:通过len变量动态跟踪当前数位长度

优化方案与注意事项

优化方向

  1. 预分配数组空间:可预先分配200位空间,避免频繁扩容
  2. 提前终止判断:在加法操作前即可判断是否已产生回文
  3. 进制处理统一化:将16进制特殊处理合并到通用逻辑中

关键细节说明

  1. 输入处理

    • 使用len-i-1实现字符串反转初始化
    • 正确处理字母A-F(10-15)的转换
  2. 进位逻辑

    • 从低位到高位处理进位
    • 每次加法后检查最高位是否需要扩容
  3. 回文判断

    • 只需检查前半部分与对应后半部分是否相等

测试样例分析

示例1

输入

9
87

输出

STEP=4

过程

87(10) = 106(9)
106 + 601 = 707(回文,4步)

示例2

输入

10
196

输出

Impossible!

(著名的回文数猜想反例)

复杂度分析

  • 时间复杂度:O(30*L),其中L为最大数位长度(≤200)
  • 空间复杂度:O(L),使用固定大小数组存储

总结

  1. 本题核心是掌握大数运算在模拟题中的应用
  2. 关键点在于:
    • 正确实现进制转换
    • 高效处理大数加法与进位
    • 准确判断回文结构
  3. 实际编程时需特别注意:
    • 数组越界问题(动态维护len变量)
    • 不同进制的字符处理(0-9和A-F)
    • 步骤计数器的初始值与终止条件

通过本题可以巩固:

  • 进制转换的双向实现
  • 大数运算的基本技巧
  • 模拟算法的优化策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux线程深度解析:从基础到实践

Linux线程深度解析&#xff1a;从基础到实践 一、线程基础概念 1. 进程与线程定义 进程&#xff1a;一个正在运行的程序&#xff0c;是操作系统资源分配的最小单位&#xff08;拥有独立的地址空间、文件描述符等资源&#xff09;&#xff0c;状态包括就绪、运行、阻塞。线程…

php学习笔记(全面且适合新手)

以下是专为 PHP 7.4 初学者设计的全面学习文档&#xff0c;涵盖基础语法、细节语法和进阶语法&#xff0c;结合 PHP 7.4 新特性与实战案例&#xff0c;帮助系统掌握 PHP 开发&#xff1a; 为什么特地做7.4的笔记而不做8的&#xff1f;因为公司用的7.4&#xff0c;哈哈 一、基…

开源分布式数据库(TiDB)

TiDB是由PingCAP 开发的开源分布式数据库&#xff0c;兼容 MySQL 协议&#xff0c;集成了 HTAP&#xff08;混合事务和分析处理&#xff09;的能力&#xff0c;能够同时处理在线事务和实时分析任务。 2015 年&#xff0c;TiDB 在 GitHub 创建&#xff0c;2025 年&#xff0c;Ti…

SpringBoot+Mybatis通过自定义注解实现字段加密存储

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBootMybatis实现字段加密 ⏱️ 创作时间&#xff1a; 2025年04月…

Windows 10系统中找回MySQL 8的root密码

以下是 在Windows 10系统中找回MySQL 8的root密码 的详细步骤&#xff1a; 步骤1&#xff1a;停止MySQL服务 按 Win R 输入 services.msc&#xff0c;打开「服务」管理器。找到 MySQL80&#xff08;或其他自定义服务名&#xff09;&#xff0c;右键选择 停止。 步骤2&#xf…

【计网】互联网的组成

回顾&#xff1a; 互联网(Internet)&#xff1a;它是一个专有名词&#xff0c;是一个特定的互连网&#xff0c;它是指当下全球最大的、最开放的、由众多网络相互连接而形成的特定的的互连网&#xff0c;采用TCP/IP协议族作为通信规则。 一、互联网的组成部分 从互联网的工作方…

【vue3】黑马程序员前端Vue3小兔鲜电商项目【八】

黑马程序员前端Vue3小兔鲜电商项目【八】登录页面 登录页面的主要功能就是表单校验和登录登出业务。 账号密码 accountpasswordcdshi0080123456cdshi0081123456cdshi0082123456cdshi0083123456cdshi0084123456cdshi0085123456cdshi0086123456cdshi0087123456cdshi0088123456 …

C++学习:六个月从基础到就业——C++11/14:右值引用与移动语义

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;右值引用与移动语义 本文是我C学习之旅系列的第三十九篇技术文章&#xff0c;也是第三阶段"现代C特性"的第一篇&#xff0c;主要介绍C11/14中引入的右值引用和移动语义。查看完整系列目录了解更多内容。 引…

基于Qlearning强化学习的电梯群控系统高效调度策略matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 Q-learning强化学习原理 2.2 基于Q-learning的电梯群控系统建模 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作…

31.软件时序控制方式抗干扰

软件时序控制方式扛干扰 1. 软件时序控制抗干扰的时间逻辑2. 应用案例 1. 软件时序控制抗干扰的时间逻辑 &#xff08;1&#xff09;将受软件控制的功能或软件检测到的状态一一罗列&#xff1b; &#xff08;2&#xff09;将其中的潜在干扰和敏感信号分开&#xff1b; &#x…

Ubuntu环境下使用uWSGI服务器【以flask应用部署为例】

0、前置内容说明 首先要知道WSGI是什么&#xff0c;关于WSGI服务器的介绍看这篇&#xff1a;WSGI&#xff08;Web Server Gateway Interface&#xff09;服务器 由于从Python 3.11开始限制了在系统级 Python 环境中使用 pip 安装第三方包&#xff0c;以避免与系统包管理器&am…

d3_v7绘制折线图

<!DOCTYPE html> <html><head><meta charsetutf-8><title>需求</title><script src"https://d3js.org/d3.v7.min.js"></script><style>* {margin: 0;padding: 0;}html, body {width: 100%;height: 100%;displ…

Hotspot分析(1):单细胞转录组识别信息基因(和基因模块)

这一期我们介绍一个常见的&#xff0c;高分文章引用很高的一个单细胞转录组分析工具Hotspot&#xff0c;它可针对单细胞转录组数据识别有意义基因或者基因module&#xff0c;类似于聚类模块。所谓的”informative "的基因是那些在给定度量中相邻的细胞之间以相似的方式表达…

爬虫准备前工作

1.Pycham的下载 网址&#xff1a;PyCharm: The only Python IDE you need 2.Python的下载 网址&#xff1a;python.org&#xff08;python3.9版本之后都可以&#xff09; 3.node.js的下载 网址&#xff1a;Node.js — 在任何地方运行 JavaScript&#xff08;版本使用18就可…

基于Springboot旅游网站系统【附源码】

基于Springboot旅游网站系统 效果如下&#xff1a; 系统登陆页面 系统主页面 景点信息推荐页面 路线详情页面 景点详情页面 确认下单页面 景点信息管理页面 旅游路线管理页面 研究背景 随着互联网技术普及与在线旅游消费习惯的深化&#xff0c;传统旅游服务模式面临效率低、…

利用KMP找出模式串在目标串中所有匹配位置的起始下标

问题关键&#xff1a;完成首次匹配之后需要继续进行模式匹配。 到这一步后&#xff0c;我们不能直接将j 0然后开始下一轮匹配&#xff0c;因为已经匹配过的部分&#xff08;蓝色部分&#xff09;中仍然可能存在与模式串重叠的子串&#xff1a; 解决办法&#xff1a; 找到蓝…

RR(Repeatable Read)级别如何防止幻读

在 MySQL 数据库事务隔离级别中&#xff0c;RR&#xff08;可重复读&#xff09; 通过 MVCC&#xff08;多版本并发控制&#xff09; 和 锁机制 的组合策略来避免幻读问题。 一、MVCC机制&#xff1a;快照读与版本控制 快照读&#xff08;Snapshot Read&#xff09; 每个事务启…

Android运行时ART加载类和方法的过程分析

目录 一,概述 二,ART运行时的入口 一,概述 既然ART运行时执行的都是翻译DEX字节码后得到的本地机器指令了&#xff0c;为什么还需要在OAT文件中包含DEX文件&#xff0c;并且将它加载到内存去呢&#xff1f;这是因为ART运行时提供了Java虚拟机接口&#xff0c;而要实现Java虚…

Javase 基础加强 —— 02 泛型

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 认识泛型…

Oracle VirtualBox 在 macOS 上的详细安装步骤

Oracle VirtualBox 在 macOS 上的详细安装步骤 一、准备工作1. 系统要求2. 下载安装包二、安装 VirtualBox1. 挂载安装镜像2. 运行安装程序3. 处理安全限制(仅限首次安装)三、安装扩展包(增强功能)四、配置第一个虚拟机1. 创建新虚拟机2. 分配内存3. 创建虚拟硬盘4. 加载系…