摘要:
简单字符串处理,对着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
|
#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
|
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
需要强转,(高类型转低类型)。