题解:P16429 应试玉符

题目传送门

前置知识

思路

简单的模拟。

遍历密码的每一个字符,如果当前字符 \(c\) 的 ASCII 值在 \(0\)\(9\) 之间,则其为数字,对应数字合法的布尔类型变量 \(f_1 \leftarrow 1\)。同理判断小写字母和大写字母。最后判断是否有 \(6\) 个字符即可。

对于用户名,由于合法名称长度一定为 \(7\),且数据保证:

所有给出的账号名称的形式都为 ZJ-a,其中 \(a\) 为非负整数。

所以只需判断长度是否为 \(7\) 即可。注意题目说 \(a\)正整数,所以应特判 ZJ-0000 的特殊情况。

代码

注意多测清空。

AC Code
#include <iostream>
#include <string>
using namespace std;
string n,p;
int T;
bool f1,f2,f3,f4;
int main()
{
    cin >> T;
    while(T--)
    {
        cin >> n >> p;
        // 多测清空
        f1=f2=f3=f4=0;
        // 判断用户名,注意特判"ZJ-0000"的特殊情况
        f4=(n.size()==7&&n!="ZJ-0000");
        // 判断密码
        // 遍历
        for(char i:p)
        {
            // 小写字母
            if('a'<=i&&i<='z')
            {
                f1=1;
            }
            // 大写字母
            else if('A'<=i&&i<='Z')
            {
                f2=1;
            }
            // 数字
            else
            {
                f3=1;
            }
            // 一个小优化
            if(f1&&f2&&f3)
            {
                break;
            }
        }
        // 至少6个字符
        if(p.size()<6)f1=0;
        // 检查合法性,注意检查顺序
        if(!f4)
        {
            cout << "Wrong Name\n";
        }
        else if(!f1||!f2||!f3)
        {
            cout << "Wrong Password\n";
        }
        else
        {
            cout << "Accept\n";
        }
    }
    return 0;
}
posted @ 2026-05-15 22:22  kevin1426730  阅读(3)  评论(0)    收藏  举报