小书童——凯撒密码 - 洛谷
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();String num=sc.next();for(int i=0;i<num.length();i++) {char nu=num.charAt(i);nu=(char)((nu-'a'+n)%26+'a');System.out.print(nu);}}
}
下面是另一种代码,
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取移动位数 int n = scanner.nextInt(); // 读取原文字符串 String original = scanner.next(); // 初始化密码字符串 StringBuilder password = new StringBuilder(); // 遍历原文字符串中的每个字符 for (int i = 0; i < original.length(); i++) { char ch = original.charAt(i); // 根据移动位数计算新字符 char newChar = (char) ((ch - 'a' + n) % 26 + 'a'; // 将新字符添加到密码字符串中 password.append(newChar); } // 输出密码 System.out.println(password.toString()); // 关闭Scanner scanner.close(); }
}
分别解释 StringBuilder
、original.charAt(i)
和 (char) ((ch - 'a' + n) % 26 + 'a')
这三个表达式。
- StringBuilder
StringBuilder
是 Java 中的一个类,用于构建可变字符序列。它是 String
的一个可变版本,非常适合在需要频繁修改字符串的场景中使用。使用 StringBuilder
可以避免在每次修改字符串时都创建新的 String
对象,从而提高性能。
一些常用的 StringBuilder
方法包括:
append()
: 追加内容到StringBuilder
。insert()
: 在指定位置插入内容。delete()
: 删除指定位置的字符。replace()
: 替换指定位置的字符。toString()
: 将StringBuilder
转换为String
。
例如:
java复制代码
StringBuilder sb = new StringBuilder("Hello"); | |
sb.append(" World!"); | |
System.out.println(sb.toString()); // 输出 "Hello World!" |
- original.charAt(i)
这是一个从字符串 original
中获取指定位置 i
的字符的方法。charAt()
方法接受一个索引 i
(从 0 开始),并返回该索引处的字符。
例如:
java复制代码
String original = "abcdef"; | |
char ch = original.charAt(2); // ch 的值为 'c' |
- (char) ((ch - 'a' + n) % 26 + 'a')
这是一个计算新字符的表达式,通常用于实现 Caesar cipher(凯撒密码)或其他类似的字符替换算法。这里的 ch
是一个字符,n
是一个整数,表示移动的位数。
ch - 'a'
: 将字符ch
转换为从 0 开始的数字。例如,如果ch
是 'a',则结果为 0;如果ch
是 'b',则结果为 1,以此类推。ch - 'a' + n
: 将ch
对应的数字加上n
,表示将字符向前移动n
位。(ch - 'a' + n) % 26
: 使用模运算确保结果始终在 0 到 25 之间,从而确保字符不会超出小写字母的范围。(ch - 'a' + n) % 26 + 'a'
: 将数字转换回字符。如果结果为 0,则得到 'a';如果结果为 1,则得到 'b',以此类推。
例如,如果 ch
是 'a' 且 n
是 3,那么这个表达式将返回 'd'。
希望这可以帮助你理解这三个表达式!如果你有任何其他问题或需要进一步的解释,请告诉我。