为了准备 PAT,评判系统有时必须对用户生成随机密码。问题是经常有一些困惑的密码很难去辨别 数字 1 还是 小写字母 L,或者 数字 0 还是 大写字母O,一个解决方案就是 把 数字 1 换成 @,数字 0 换成 %,小写 l 换成大写 L,大写 O 换成小写 o,现在你的工作就是去写一个程序检查系统产生的账户,然后帮助系统修改令人困惑的密码
输入格式:
每个输入文件包含一个测试用例。每个用例包含一个正整数 N(<=1000),然后紧接着 N 行账户数据。每个账户由用户名和密码组成,这两个字符串都是不超过10个字符并且没有空格
输出格式:
对于每一个测试用例,第一输出 被修改账户的数字 M,然后紧接着打印出M行 修改后的账户信息,那就是用户名必须和被修改的密码相关联。账户必须以输入的顺序打印出来。如果没有账户被修改,第一行打印 “There are N accounts and no account is modified” N 就是账户的总个数。然而,如果 N 是1,你必须打印 “There is 1 account and no account is modified”。
代码:
#include <cstdio>
#include <cstring>
// 定义改变字符函数
void change(char* c){
if(*c == '1')
*c = '@';
else if(*c == '0')
*c = '%';
else if(*c == 'l')
*c = 'L';
else if(*c == 'O')
*c = 'o';
}
int main(){
int n;
scanf("%d", &n);
char user[1010][15];
char pwd[1010][15];
// 输入用户名和密码
for(int i = 0; i < n; i++){
scanf("%s %s", user[i], pwd[i]);
}
// count计数,被修改的数
int count = 0;
int flag[1010] = {0};
for(int i = 0; i < n; i++){
int len = strlen(pwd[i]);
for(int j = 0; j < len; j++){
if((pwd[i][j] == '1') || (pwd[i][j] == '0') || (pwd[i][j] == 'l') || (pwd[i][j] == 'O')){
char* p = &pwd[i][j];
change(p);
flag[i] = 1;
}
}
if(flag[i] == 1)
count++;
}
// 没有注意 are 应该是 is ,还有 accounts的单数形式,从而一个测试点没有通过
if(count == 0 && n == 1){
printf("There are 1 accounts and no account is modified");
}else if(count == 0){
printf("There are %d accounts and no account is modified", n);
}else {
printf("%d\n", count);
for(int i = 0; i < n; i++){
if(flag[i] == 1){
printf("%s %s\n", user[i], pwd[i]);
}
}
}
return 0;
}