VIRTUALS

the virtual labs for the virtuals

0%

HJ21. 简单密码

摘要:
简单字符串处理,对着ASCII码表做。

题目

描述
密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。

假设渊子原来一个BBS上的密码为 $zvbo9441987$,为了方便记忆,他通过一种算法把这个密码变换成 $YUANzhi1987$,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。

他是这么变换的,大家都知道手机上的字母:
$1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8, wxyz–9, 0–0$,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,

声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:$X$,先变成小写,再往后移一位,不就是 $y$ 了嘛,简单吧。记住,$z$ 往后移是 $a$ 哦。

输入描述:
输入包括多个测试数据。输入是一个明文,密码长度不超过 $100$ 个字符,输入直到文件结尾

输出描述:
输出渊子真正的密文

示例1

输入:
YUANzhi1987

输出:
zvbo9441987

ASCII码

根据规则按照ASCII码处理即可,这道题可以帮助自己熟悉常见字符的ASCII码。
以下是常见的字符和ASCII码的对应关系:

  • 数字 $0: 48$
  • 数字 $9: 48 + 9$
  • 字母 $A: 65$
  • 字母 $Z: 65 + 25$
  • 字母 $a: 97$
  • 字母 $z: 97 + 25$

还有个需要关注的是,大写字母转为对应的小写字母是 $+ 32$.

本题还有个需要注意的是,当大写字母转小写字母 $+ 1$ 溢出最后一位的时候,会回到 $a$.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
* author: etoa
* 2021-08-20 10:35:43
*/
#include <bits/stdc++.h>

using namespace std;

constexpr int N = 26;
int hashmap[N] = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};

int main()
{
string s;
cin >> s;
string res;
for (int i = 0, n = s.size(); i < n; i ++) {
if (isupper(s[i])) res += (s[i] + 32 + 1) > 122 ? (s[i] + 32 + 1) % 123 + 97 : (s[i] + 32 + 1);
else if (islower(s[i])) res += hashmap[s[i] - 97] + 48;
else res += s[i];
}
cout << res << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 
* author: etoa
* 2021-08-20 10:58:36
*/
import java.util.*;

public class Main {
private static int[] hash = new int[]{2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
StringBuilder res = new StringBuilder();
for (int i = 0, n = s.length(); i < n; i++) {
char c = s.charAt(i);
if (Character.isUpperCase(c)) res.append(c + 32 + 1 > 122 ? (char)((c + 32 + 1) % 123 + 97) : (char)(c + 32 + 1));
else if (Character.isLowerCase(c)) res.append((char)(hash[c - 97] + 48));
else res.append(c);
}
System.out.println(res);
}
}

注意Java int 类型的ASCII码转 char 需要强转,(高类型转低类型)。

原题链接: HJ21. 简单密码