专栏文章
B3843 [GESP202306 三级] 密码合规
B3843题解参与者 28已保存评论 29
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 29 条
- 当前快照
- 1 份
- 快照标识符
- @mio0wxh2
- 此快照首次捕获于
- 2025/12/02 11:33 3 个月前
- 此快照最后确认于
- 2025/12/02 11:33 3 个月前
欢迎大家报名洛谷网校的课程,期待和大家一起进步!
首先,我们需要处理输入。题目给出的输入是一长串由逗号分隔的密码,一个非常巧妙的方法是,在读取了整行输入后,我们可以在字符串的末尾手动添加一个逗号。这样做的好处是,无论是中间的密码还是最后一个密码,它们后面都有一个逗号作为结束标志,我们的处理逻辑就可以统一起来,避免为最后一个密码写特殊的处理代码。这部分的代码:
CPPint main() {
string s;
cin >> s;
s += ',';
string pwd = "";
for (int i = 0; i < s.length(); ++i) {
char c = s[i];
if (c == ',') {
// 遇到逗号,说明一个密码结束了
// 检查这个密码是否合规
if (check(pwd)) {
cout << pwd << endl;
}
pwd = "";
} else {
pwd += c;
}
}
return 0;
}
接下来是关键的检查环节。我们可以编写一个专门的函数来负责检查单个密码是否合规。
一、长度检查。这是最简单的,密码的长度必须在 6 到 12 个字符之间,不多不少。如果长度不达标,直接判定为不合格。
二、字符合法性检查。我们需要逐一检查密码中的每一个字符。我们可以设置几个“标志”变量,分别记录是否出现了小写字母、大写字母、数字和特殊字符。在遍历密码时,如果遇到一个字符,它既不是小写字母,也不是大写字母,也不是数字,更不是那四种允许的特殊字符之一,那就说明出现了非法字符,这个密码也立刻被判定为不合格。
三、内容组合检查。如果在第二步中,所有字符都合法,我们就要利用检查过程中记录下的“标志”变量来进行最后的判断。规则要求:1. 必须至少有一个特殊字符。2. 在小写字母、大写字母、数字这三类中,必须至少出现两种。我们可以统计一下这三类字符出现了几种,如果种类数小于 2,或者特殊字符根本没出现,那么这个密码同样不合格。
只有当一个密码顺利通过了以上所有的检查,我们才能认定它是一个合规的密码,并按照题目的要求将它输出。
CPPbool check(string s) {
int len = s.length();
if (len < 6 || len > 12) {
return false;
}
int low = 0, upp = 0, dig = 0, spc = 0;
for (int i = 0; i < len; ++i) {
char c = s[i];
if (islower(c)) { // 是小写字母
low = 1;
} else if (isupper(c)) { // 是大写字母
upp = 1;
} else if (isdigit(c)) { // 是数字
dig = 1;
} else if (c == '!' || c == '@' || c == '#' || c == '$') { // 是特殊字符
spc = 1;
} else {
return false;
}
}
if (spc == 1 && (low + upp + dig) >= 2) {
return true;
}
return false;
}
相关推荐
评论
共 29 条评论,欢迎与作者交流。
正在加载评论...
