1067 试密码 (20 point(s))
// 13 points
#include <bits/stdc++.h>
using namespace std;
int main() {
string pass, check; int N;
cin >> pass >> N;
while(cin >> check){
if(check == "#") {return 0;}
if(N == 0) {cout << "Account locked" << endl; return 0;}
if(check == pass) {cout << "Welcome in" << endl; return 0;}
else {cout << "Wrong password: " << check << endl; N--;}
}
}
#include <bits/stdc++.h>
using namespace std;
int main() {
string pass, check; int N;
cin >> pass >> N;
// 吃掉 cin getline 之间的换行
getchar();
while(getline(cin, check)){
if(check == "#") {return 0;}
if(check == pass) {cout << "Welcome in" << endl; return 0;}
else {cout << "Wrong password: " << check << endl; N--;}
if(N == 0) {cout << "Account locked" << endl; return 0;}
}
}
最开始卡了三个测试点 2 4 5 。看了别人的分析改了两个问题。
一个是测试点2 5,题目说正确密码 “长度不超过 20 的、不包含空格、Tab、回车的非空字符串” 不包含空格,但是没有说输入密码的时候的字符串不包括空格,所以得用 getline() 而用 getline() 前面可能有为吃掉的换行(cin会吃掉一切空相关的字符,getline不会),所以还得手动吃掉换行,用 getchar() 。
可以额外记一下,看到这种输入样例的,并且是字符串类型的,整行整行类型最好考虑用 getline() 防止冷不丁,可能是自己没有看到题目描述,或者就是题目故意卡测试点。
还有一个是题目的描述。
如果是错误的,则在一行中按格式输出 Wrong password: 用户输入的错误密码;当错误尝试达到 N 次时,再输出一行 Account locked,并结束程序
注意描述里面的 再 刚开始我还以为这两个是平行的判断关系,所以两个的位置没怎么注意,以为是在开头判断。但加了题目的再的话,说明这两个是递进的关系,意味着在错误的时候不仅仅要输出错误信息,还得判断这次错误之后是否已经没有尝试次数,从而输出信息结束程序(不得不说,后面这些题目越来越多读题上目的细节)。
所以把原来的判断为止换一下位置即可,在错误之后紧接着判断是否已经没有尝试次数,而不是进入下一次循环判断下一次输入。
浙公网安备 33010602011771号