如何在C#中实现维吉尼亚密码表的字母循环功能?
解决维吉尼亚密码表的字母循环问题
你的代码目前存在两个核心问题:一是每行输出的字符数随循环递减(k从26降到1),但标准维吉尼亚表的每一行都必须包含26个字母;二是无法在输出Z后循环回到A,因为Enumerable.Range(i, k)会直接按ASCII值递增,超出Z后会输出非字母字符。
要实现字母循环效果,我们可以通过模运算来计算每个位置的字符:对于以字符i开头的行,第pos个位置的字符可通过(i - 'A' + pos) % 26 + 'A'推导得出,逻辑如下:
i - 'A'将起始字母转换为0-25的偏移量(A=0,B=1,……,Z=25)- 加上当前位置
pos(0到25)得到总偏移量 - 对26取模,实现超出Z后从A开始循环
- 加上'A'转换回对应的ASCII字母
修正后的完整代码如下:
using System; using System.Linq; class VigenereTable { public static void Main(string[] args) { for (char i = 'A'; i <= 'Z'; i++) { Enumerable.Range(0, 26) .Select(pos => (char)((i - 'A' + pos) % 26 + 'A')) .ToList() .ForEach(c => Console.Write(c)); Console.WriteLine(); } } }
这段代码会输出标准的维吉尼亚密码表:每行从起始字母依次递增,遇到Z后自动回到A,且每行始终保持26个字符的长度。
内容的提问来源于stack exchange,提问作者Aryaman Shrestha
相关产品推荐
相关产品推荐

