You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

凯撒密码数组越界问题:如何循环回到数组起始位置?

解决凯撒密码偏移时的数组越界问题

嘿,我来帮你搞定这个凯撒密码的越界问题!你遇到的核心问题是偏移后超出字母表范围时,没实现「循环回开头」的逻辑,这时候用**模运算(%)**就能完美解决——它能自动把超出范围的数值映射回字母表的有效索引内。

先给你修正后的完整代码,再一步步拆解关键逻辑:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:47:11