题解:洛谷 B4003 移位

【题目来源】

洛谷:B4003 [GESP202406 三级] 移位 - 洛谷

【题目描述】

小杨学习了加密技术移位,所有大写字母都向后按照一个固定数目进行偏移。偏移过程会将字母表视作首尾相接的环,例如当偏移量是3的时候,大写字母A会替换成D,大写字母Z会替换成C,总体来看大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ会被替换成DEFGHIJKLMNOPQRSTUVWXYZABC。

注:当偏移量是26的倍数时,每个大写字母经过偏移后会恰好回到原来的位置,即大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ经过偏移后会保持不变。

【输入】

第一行包含一个正整数n。

【输出】

输出在偏移量为n的情况下,大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ移位替换后的结果。

【输入样例】

3

【输出样例】

DEFGHIJKLMNOPQRSTUVWXYZABC

【核心思想】

  1. 问题分析:给定偏移量 \(n\),将大写字母表 A-Z 进行循环移位,每个字母向后偏移 \(n\) 位(Z 之后回到 A)。这是一个字符串循环移位问题,核心在于利用取模运算实现字母表的环形偏移。

  2. 算法选择

    • 取模循环:利用 \((i + n) \bmod 26\) 实现字母表的环形偏移,\(i\) 为原字母在 A-Z 中的位置(\(0\)-\(25\)
  3. 关键步骤

    • 读入数据:读取 \(n\)
    • 生成移位后字母表\(i\)\(0\)\(25\)):
      • \(j \leftarrow (i + n) \bmod 26\):计算偏移后的位置
      • \(ch \leftarrow 'A' + j\):转换为对应字符
      • 输出 \(ch\)
    • 输出结果:连续输出 \(26\) 个字符
  4. 时间/空间复杂度

    • 时间复杂度:\(O(26) = O(1)\)
    • 空间复杂度:\(O(1)\)
  5. 循环移位与取模的核心思想

    • 环形映射:将字母表视为长度为 \(26\) 的环,偏移 \(n\) 位等价于在环上前进 \(n\) 步。取模运算 $ \bmod 26$ 自然处理越界情况,如 Z(\(25\)) 偏移 \(3\) 位:\((25 + 3) \bmod 26 = 2\),对应 C
    • 偏移量归一化:当 \(n\)\(26\) 的倍数时,\((i + n) \bmod 26 = i\),字母表不变。取模运算自动处理任意大小的偏移量,无需预处理
    • 字符编码的连续性:ASCII 码中大写字母 'A'-'Z' 是连续编码的,利用 'A' + j 可直接得到对应字符,无需查表
    • 适用于基础字符串变换、循环移位类入门问题

【算法标签】

入门 #字符串入门

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    for (int i=0; i<26; i++) {
        int j = (i+n) % 26;  // j:字符偏移后离'A'的距离
        char ch = 'A' + j;  // ch:距离'A'为j的字符
        cout << ch;  //输出偏移后的字符
    }
    return 0;
}

【运行结果】

3
DEFGHIJKLMNOPQRSTUVWXYZABC
posted @ 2026-07-17 15:03  团爸讲算法  阅读(13)  评论(0)    收藏  举报