头像

Cyan

四川成都

深度强化学习炼丹师

2012年第三届蓝桥杯省赛-H.密码发生器

2012年第三届蓝桥杯省赛-H.密码发生器

2021-12-02 · 42次阅读 · 原创 · 数据结构与算法

原题链接

题面

在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全;如果设置不好记的密码,又担心自己也会忘记;如果写在纸上,担心纸张被别人发现或弄丢了。

这个程序的任务就是把一串拼音字母转换为 6 位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing )作为输入,程序输出 6 位数字。

变换的过程如下:

第一步. 把字符串 6 个一组折叠起来,比如 wangximing 则变为:

wangxi

ming

第二步. 把所有垂直在同一个位置的字符的 ascii 码值相加,得出 6 个数字,如上面的例子,则得出:

228 202 220 206 120 105

第三步.再把每个数字"缩位"处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如: 228 => 2+2+8=12 => 1+2=3

上面的数字缩位后变为:344836, 这就是程序最终的输出结果!

要求程序从标准输入接收数据,在标准输出上输出结果。

输入描述

第一行是一个整数 n(n<100),表示下边有多少输入行,

接下来是 n 行字符串,就是等待变换的字符串。

输出描述

输出 n 行变换后的 6 位密码。

输入样例

5
zhangfeng
wangximing
jiujingfazi
woaibeijingtiananmen
haohaoxuexi

输出样例

772243
344836
297332
716652
875843

题解

模拟

没啥好说的,按照题目要求模拟即可,具体见代码。

代码

#include<iostream> #include<string> #include<vector> using namespace std; int n; int main() { cin >> n; string s; while (n--) { cin >> s; vector<string> list; for (int i = 0; i < s.length(); i += 6) { list.push_back(s.substr(i, 6)); } vector<int> a(6, 0); for (auto t:list) { for (int i = 0; i < t.length(); ++i) { a[i] += t[i]; } } string res; for (int i = 0; i < 6; ++i) { while (a[i] >= 10) { int s = 0; while (a[i]) { s += a[i] % 10; a[i] /= 10; } a[i] = s; } res.push_back(a[i] + '0'); } cout << res << endl; } return 0; }

标题: 2012年第三届蓝桥杯省赛-H.密码发生器
链接: https://www.fightingok.cn/detail/156
更新: 2022-09-18 22:43:46
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可