更安全的密码
题目描述
小T学院最近经常出现学生账号被盗的情况,主要原因是大量学生设置的密码过于简单。
身为学院内最具智慧的小T,想出了一个解决方案:制定一套密码规则,提升密码的安全性,同时将现有不符合这套规则的学生密码进行批量更新
目前新的密码规则如下:
- 必须至少由 7 个字符组成
- 必须至少含有 1 个大写英文字母
- 必须至少含有 1 个小写英文字母
- 必须至少含有 1 个数字
- 必须至少含有 1 个特殊字符。特殊字符只允许使用
#
、@
、*
、&
这几种。
接下来就是批量修改不符合规则的密码了,小T打算让你帮忙设计一个程序,检测学生密码的规范性。假如学生密码符合上述规则,则不做处理;否则对密码进行修改。
为了学生便于记忆,小T希望在保留旧密码字符串的前提下,尽可能少的在末尾添加新字符来适配新的密码规则。
输入格式
第一行一个整数 TT,表示共有 TT 组数据,每组数据格式如下:
第一行一个整数 LL,表示旧密码的长度
第二行一个长度为 LL 的字符串(不含空格),表示旧密码。
输出格式
共 TT 行,每行对应一组数据的答案。
对于每一组数据,答案并不唯一,只需要输出任意一种符合题目要求的答案即可。
测试样例
输入样例 #1
2
4
2258
8
11112567
输出样例 #1
2258zA&
11112567c@K
输入样例 #2
3
1
B
2
3*
7
1234aB&
输出样例 #2
Ba1*439
3*zxCD*
1234aB&
数据范围
对于 50%50% 的数据,旧密码仅由数字组成,且 7≤L≤1047≤L≤104。
对于 100%100% 的数据,1≤T≤100,1≤L≤1041≤T≤100,1≤L≤104,旧密码仅可能由大小写字母、数字、规定范围内的特殊字符组成。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int N;
string password;
int main(){
int t;
cin >> t;
while(t--){
int l;
cin >> l;
cin >> password;
bool condition2 = false;
bool condition3 = false;
bool condition4 = false;
bool condition5 = false;
for (int i = 0; i < password.size(); i++) {
if (password[i] >= 'A' && password[i] <= 'Z')
condition2 = true;
else if (password[i] >= 'a' && password[i] <= 'z')
condition3 = true;
else if (password[i] >= '0' && password[i] <= '9')
condition4 = true;
else if (password[i] == '@' || password[i] == '#' || password[i] == '&' || password[i] == '*')
condition5 = true;
}
if (!condition2) password.append("A"); // Append any uppercase English alphabet letter.
if (!condition3) password.append("a"); // Append any lowercase English alphabet letter.
if (!condition4) password.append("1"); // Append any digit.
if (!condition5) password.append("#"); // Append any special character.
// Append any digit, letter, or a special character.
while (password.size() < 7) password.append("1");
cout << password << endl;
}
return 0;
}