题解:P16429 应试玉符

📅 2026/7/8 19:04:29 👁️ 阅读次数 📝 编程学习
题解:P16429 应试玉符

题目传送门

前置知识

  • ASCII 码

思路

简单的模拟。

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

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

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

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

代码

注意多测清空。

#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;
}