凯撒密码
第一行给出整数 k,第二行给出一行字符串。
把每个英文字母替换为字母表中往后 k 位的字母。
z 之后回到 a(Z 之后回到 A),大写仍为大写,小写仍为小写。
不是英文字母的字符(数字、符号、空格)保持不变。
- 输入
- 0 ≤ k ≤ 1000。
字符串长度 1 到 200,仅 ASCII 可打印字符(编码 32 到 126) - 输出
- 转换后的一行字符串
3 Hello, World! xyz
Khoor, Zruog! abc
第一行给出整数 k,第二行给出一行字符串。
把每个英文字母替换为字母表中往后 k 位的字母。
z 之后回到 a(Z 之后回到 A),大写仍为大写,小写仍为小写。
不是英文字母的字符(数字、符号、空格)保持不变。
3 Hello, World! xyz
Khoor, Zruog! abc
运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。
$ 就绪
请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。
字符与数字互相转换的方法因语言而异:Python ord(c)/chr(n),JS/TS c.charCodeAt(0)/String.fromCharCode(n),Craykon 字符.编码(c)/字符.从编码(n)。
Java、C#、C、C++ 的 char 本身就是数字,可以直接 c - 'a',再用 (char) 转回来。
公式都一样:(c - 'a' + k) % 26 + 'a'。
两个陷阱:忘了 % 26,z 之后会变成 { 这样的符号(k 最大 1000,必须取模);不判断是否为字母就全部移位,空格和数字也会被改变。
k = int(input())s = input()out = []for c in s: if "a" <= c <= "z": out.append(chr((ord(c) - ord("a") + k) % 26 + ord("a"))) elif "A" <= c <= "Z": out.append(chr((ord(c) - ord("A") + k) % 26 + ord("A"))) else: out.append(c)print("".join(out))const lines = require("fs").readFileSync(0, "utf8").split("\n");const k = Number(lines[0]);const s = lines[1].replace(/\r$/, "");const shift = (c, base) => String.fromCharCode(((c.charCodeAt(0) - base + k) % 26) + base);let out = "";for (const c of s) { if (c >= "a" && c <= "z") out += shift(c, 97); else if (c >= "A" && c <= "Z") out += shift(c, 65); else out += c;}console.log(out);import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const k: number = Number(lines[0]);const s: string = lines[1].replace(/\r$/, "");const shift = (c: string, base: number): string => String.fromCharCode(((c.charCodeAt(0) - base + k) % 26) + base);let out = "";for (const c of s) { if (c >= "a" && c <= "z") out += shift(c, 97); else if (c >= "A" && c <= "Z") out += shift(c, 65); else out += c;}console.log(out);import java.io.BufferedReader;import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int k = Integer.parseInt(br.readLine().trim()); String s = br.readLine(); StringBuilder out = new StringBuilder(); for (char c : s.toCharArray()) { if (c >= 'a' && c <= 'z') out.append((char) ((c - 'a' + k) % 26 + 'a')); else if (c >= 'A' && c <= 'Z') out.append((char) ((c - 'A' + k) % 26 + 'A')); else out.append(c); } System.out.println(out); }}using System;using System.Text; class Program{ static void Main() { int k = int.Parse(Console.ReadLine()); string s = Console.ReadLine(); var sb = new StringBuilder(); foreach (char c in s) { if (c >= 'a' && c <= 'z') sb.Append((char)((c - 'a' + k) % 26 + 'a')); else if (c >= 'A' && c <= 'Z') sb.Append((char)((c - 'A' + k) % 26 + 'A')); else sb.Append(c); } Console.WriteLine(sb.ToString()); }}#include <iostream>#include <string> int main() { int k; std::string s; std::cin >> k; std::cin.ignore(1, '\n'); std::getline(std::cin, s); if (!s.empty() && s.back() == '\r') s.pop_back(); for (char& c : s) { if (c >= 'a' && c <= 'z') c = static_cast<char>((c - 'a' + k) % 26 + 'a'); else if (c >= 'A' && c <= 'Z') c = static_cast<char>((c - 'A' + k) % 26 + 'A'); } std::cout << s << "\n";}#include <stdio.h>#include <string.h> int main(void) { int k; char s[256]; if (scanf("%d ", &k) != 1) return 0; if (!fgets(s, sizeof s, stdin)) return 0; s[strcspn(s, "\r\n")] = '\0'; for (int i = 0; s[i]; i++) { char c = s[i]; if (c >= 'a' && c <= 'z') s[i] = (char)((c - 'a' + k) % 26 + 'a'); else if (c >= 'A' && c <= 'Z') s[i] = (char)((c - 'A' + k) % 26 + 'A'); } puts(s); return 0;}k = 控制台.读行().转数字();s = 控制台.读行();a = 字符.编码("a");bigA = 字符.编码("A");out = "";遍历 (c 在 s){ code = 字符.编码(c); 如果 (c >= "a" && c <= "z") { out = out + 字符.从编码((code - a + k) % 26 + a); } 否则 如果 (c >= "A" && c <= "Z") { out = out + 字符.从编码((code - bigA + k) % 26 + bigA); } 否则 { out = out + c; }}控制台.输出(out);