专栏文章

B3843 [GESP202306 三级] 密码合规

B3843题解参与者 28已保存评论 29

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
29 条
当前快照
1 份
快照标识符
@mio0wxh2
此快照首次捕获于
2025/12/02 11:33
3 个月前
此快照最后确认于
2025/12/02 11:33
3 个月前
查看原文
欢迎大家报名洛谷网校的课程,期待和大家一起进步!

首先,我们需要处理输入。题目给出的输入是一长串由逗号分隔的密码,一个非常巧妙的方法是,在读取了整行输入后,我们可以在字符串的末尾手动添加一个逗号。这样做的好处是,无论是中间的密码还是最后一个密码,它们后面都有一个逗号作为结束标志,我们的处理逻辑就可以统一起来,避免为最后一个密码写特殊的处理代码。这部分的代码:
CPP
int 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,或者特殊字符根本没出现,那么这个密码同样不合格。
只有当一个密码顺利通过了以上所有的检查,我们才能认定它是一个合规的密码,并按照题目的要求将它输出。
CPP
bool 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 条评论,欢迎与作者交流。

正在加载评论...