VIRTUALS

the virtual labs for the virtuals

0%

HJ29. 字符串加解密

摘要:
简单字符串处理,需要对ASCII码表很熟。

题目

描述

  1. 对输入的字符串进行加解密,并输出。

  2. 加密方法为:

当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母 $a$ 时则替换为 $B$;字母 $Z$ 时则替换为 $a$;

当内容是数字时则把该数字加 $1$,如 $0$ 替换 $1$,$1$ 替换 $2$,$9$ 替换 $0$;

其他字符不做变化。

  1. 解密方法为加密的逆过程。

本题含有多组样例输入。

输入描述:

输入说明
输入一串要加密的密码
输入一串加过密的密码

输出描述:

输出说明
输出加密后的字符
输出解密后的字符

示例1

输入:
abcdefg
BCDEFGH

输出:
BCDEFGH
abcdefg

根据ASCII码表进行处理

Java语言不方便直接写ASCII码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/**
* author: etoa
* code at: 2021-08-23 13:13:18
**/

#include <bits/stdc++.h>

using namespace std;

void decode(string &s)
{
string res = "";
for (int i = 0, n = s.size(); i < n; i++) {
char c = s[i];
if (isdigit(c)) {
if (c == 48) {
res += 57;
} else {
res += c - 1;
}
}
else {
if (c == 65) {
res += 97 + 25;
} else if (c == 97) {
res += 90;
} else {
res += islower(c) ? c - 32 - 1 : c + 32 -1;
}
}
}
cout << res << endl;
}

void encode(string &s)
{
string res = "";
for (int i = 0, n = s.size(); i < n; i++) {
char c = s[i];
if (isdigit(c)) {
if (c == 57) {
res += 48;
} else {
res += c + 1;
}
} else {
if (c == 90) {
res += 97;
} else if (c == 97 + 25) {
res += 65;
} else {
res += islower(c) ? c - 32 + 1: c + 32 + 1;
}
}
}
cout << res << endl;
}

int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
string stoencode;
string stodecode;
for (; cin >> stoencode;) {
cin >> stodecode;
encode(stoencode);
decode(stodecode);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
* author: etoa
* code at: 2021-08-23 13:31:12
**/
import java.util.*;

public class Main {
private static void decode(String s) {
StringBuilder res = new StringBuilder();
for (int i = 0, n = s.length(); i < n; i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
if (c == '0') {
res.append('9');
} else {
res.append((char)(c - 1));
}
} else {
if (c == 'A') {
res.append('z');
} else if (c == 'a') {
res.append('Z');
} else {
res.append(Character.isLowerCase(c) ? (char)(c - 32 - 1) : (char)(c + 32 - 1));
}
}
}
System.out.println(res.toString());
}
private static void encode(String s) {
StringBuilder res = new StringBuilder();
for (int i = 0, n = s.length(); i < n; i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
if (c == '9') {
res.append('0');
} else {
res.append((char)(c + 1));
}
} else {
if (c == 'Z') {
res.append('a');
} else if (c == 'z') {
res.append('A');
} else {
res.append(Character.isLowerCase(c) ? (char)(c - 32 + 1) : (char)(c + 32 + 1));
}
}
}
System.out.println(res.toString());
}

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String stoEncode;
String stoDecode;
for (; in.hasNext();) {
stoEncode = in.next();
stoDecode = in.next();
encode(stoEncode);
decode(stoDecode);
}
}
}

查表

本题还可使用查表方法,事先构造加解密对应的表。在此不再赘述。

原题链接: HJ29. 字符串加解密