凯撒密码数组越界问题:如何循环回到数组起始位置?
解决凯撒密码偏移时的数组越界问题
嘿,我来帮你搞定这个凯撒密码的越界问题!你遇到的核心问题是偏移后超出字母表范围时,没实现「循环回开头」的逻辑,这时候用**模运算(%)**就能完美解决——它能自动把超出范围的数值映射回字母表的有效索引内。
先给你修正后的完整代码,再一步步拆解关键逻辑:
using System; using System.Text; namespace Easy47 { class Program { static void Main(string[] args) { const string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 补全完整的26个大写字母 int offset = 3; string inputMessage = "HELLOXYZ"; // 测试用例,包含会触发越界的XYZ StringBuilder encryptedMessage = new StringBuilder(); foreach (char c in inputMessage) { int currentIndex = alphabet.IndexOf(c); if (currentIndex != -1) // 只处理字母表内的字符 { // 核心修复逻辑:用模运算实现循环偏移 int newIndex = (currentIndex + offset) % alphabet.Length; encryptedMessage.Append(alphabet[newIndex]); } else { // 非字母字符(空格、符号等)直接保留原样 encryptedMessage.Append(c); } } Console.WriteLine("加密后的消息:" + encryptedMessage.ToString()); } } }
关键逻辑拆解
- 模运算的妙用:
(currentIndex + offset) % alphabet.Length是解决越界的核心。比如:- Z的索引是25,25+3=28,28%26=2,对应字母C(正好是Z偏移3位后的正确结果)
- Y的索引是24,24+3=27,27%26=1,对应字母B
- X的索引是23,23+3=26,26%26=0,对应字母A
- 补全字母表:你原代码里的
ABCDEFGHIJKLMNOP...要补全成完整的26个大写字母,否则IndexOf会找不到后续字母,导致逻辑错误 - 兼容非字母字符:加入
currentIndex != -1的判断,确保空格、数字、符号等非字母内容不会被错误处理,直接保留
扩展小提示
如果需要支持小写字母,只需要再定义一个小写字母表,循环里判断字符大小写后分别处理即可,比如:
const string lowerAlphabet = "abcdefghijklmnopqrstuvwxyz"; // 在循环内添加判断: if (char.IsLower(c)) { /* 用小写字母表处理 */ }
内容的提问来源于stack exchange,提问作者Derrick Rose
相关产品推荐
相关产品推荐

