题目传送门
前置知识
- 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;
}
