给定一个整数 n,表示字母偏移量。我们需要输出大写字母表 ABCDEFGHIJKLMNOPQRSTUVWXYZ 在偏移量为 n 时,每个字母向后移动 n 位后的新字母表。字母表视为首尾相连的环,例如 Z 向后移动 1 位会变成 A。
这道题本质上是凯撒密码的字母表生成问题。大写字母共有 26 个,我们可以将它们编号为 0∼25,分别对应 A 到 Z。
对于原字母表(即 A 到 Z 按顺序排列),如果我们想要得到偏移后的字母表,可以这样做:
'A' + j。因为字母表是循环的,所以利用模运算可以很方便地处理 Z 之后的字母重新回到 A 的情况。
例如:
A) 变成 j=(0+3)%26=3 (D);Z) 变成 j=(25+3)%26=2 (C),正确实现了循环。算法的核心是模运算。
设字母总数 M=26。对于原字母表中的第 i 个字母(0≤i<26),偏移后的字母在字母表中的序号为:
其中 mod 表示取余数。然后输出 'A' + j 对应的字母即可。
由于只需要输出最终的大写字母表,我们直接遍历并输出即可,无需存储。
大写字母表长度固定为 26,算法只进行常数次循环,每次循环内为基本的加法和取模运算。因此时间复杂度为 O(1)。
以下是完整的 C++ 代码:
cpp1#include <iostream> 2using namespace std; 3 4int main() { 5 int n; 6 cin >> n; 7 8 // 遍历 0 到 25,分别代表 A 到 Z 9 for (int i = 0; i < 26; i++) { 10 // 计算偏移后的位置 11 int j = (i + n) % 26; 12 // 输出对应的大写字母 13 char ch = 'A' + j; 14 cout << ch; 15 } 16 cout << "\n"; // 输出换行 17 18 return 0; 19}
cin >> n; 读入偏移量。for (int i = 0; i < 26; i++) 枚举原字母表的每个位置。int j = (i + n) % 26; 利用模运算求出新字母的位置。char ch = 'A' + j; 将数字位置转换回字符。cout << "\n"; 换行。题目提供的参考代码中有一个未使用的变量 fl,可以忽略,不影响程序正确性。
本题考察了模运算在循环结构中的应用,是字符串处理和密码学中最基础的入门题目。理解模运算“循环”的特性,即可轻松解决此类问题。