编写简单列置换密码程序求助:代码问题排查与修正
列置换密码代码修正
你的原代码存在几个关键问题:矩阵维度初始化错误、循环边界越界、字符索引计算逻辑错误,还未处理文本补空格和按列读取的核心置换逻辑。以下是修正后的完整代码,完全符合你给出的输入输出要求:
public static String transpositionCipher(String text, int N) { // 计算列数:向上取整得到每行需要的字符数 int cols = (int) Math.ceil((double) text.length() / N); // 计算需要补充的空格数,确保总字符数为N*cols int padding = N * cols - text.length(); // 构建填充后的文本,不足的补空格 StringBuilder paddedText = new StringBuilder(text); for (int i = 0; i < padding; i++) { paddedText.append(' '); } String filledText = paddedText.toString(); // 创建N行cols列的矩阵 char[][] matrix = new char[N][cols]; // 按行填充矩阵 for (int i = 0; i < N; i++) { for (int j = 0; j < cols; j++) { // 计算原文本中的索引:第i行第j列对应filledText的i*cols + j位置 matrix[i][j] = filledText.charAt(i * cols + j); } } // 按列读取矩阵,拼接结果 StringBuilder result = new StringBuilder(); for (int j = 0; j < cols; j++) { for (int i = 0; i < N; i++) { result.append(matrix[i][j]); } } return result.toString(); }
关键修正点说明
- 补空格处理:当原文本长度不能被行数N整除时,补充空格至总长度为
N*cols,确保矩阵能完整填充。比如输入1中"New atak"长度为8,N=3,补充1个空格后变为9个字符,刚好填充3行3列的矩阵。 - 矩阵维度与填充逻辑:矩阵维度设为
N行×cols列,按行依次填充字符,索引计算为i*cols + j,确保每个字符对应矩阵的正确位置。 - 按列读取拼接:核心置换逻辑是按列从上到下读取每一列的字符,拼接成最终密文,这也是列置换密码的核心规则。
- 循环边界修正:原代码中
i <= N会导致数组越界,修正为i < N,确保只遍历矩阵的有效行。
测试验证
- 输入#1:
text = "New atak", N = 3,执行后返回结果为"N aeakwt",与预期一致。 - 输入#2:
text = "NOS ATACAN CON CARBUNCO", N = 5,执行后返回结果与预期输出完全匹配。
内容的提问来源于stack exchange,提问作者Daniel Requena
相关产品推荐
相关产品推荐

