每日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.pswp.cn/pingmian/79478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79478.shtml
英文地址,請注明出處:http://en.pswp.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. 加載系…