题解: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;
}

浙公网安备 33010602011771号