0分求解

B3843 [GESP202306 三级] 密码合规

jcy666 @ 2024-08-01 21:08:51

#include<bits/stdc++.h>
using namespace std;
bool pd(string s){
    bool a=false,b=false,c=false,d=false,e=false;
    if(s.size()>=6&&s.size()<=12){
        a=true;
    }
    for(int i=0;i<s.size();i++){
        if(s[i]>='a'&&s[i]<='z'){
            b=true;
        }
        if(s[i]>='A'&&s[i]<='Z'){
            c=true;
        }
        if(s[i]>='0'&&s[i]<='9'){
            d=true;
        }
        if(s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'){
            e=true;
        }
    }
    if(a&&b&&c&&d&&e){
        return true;
    }
    return false;
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    string s,x="";
    cin>>s;
    for(int i=0;i<s.size();i++){
        if(s[i]==','){
            if(pd(x)){
                cout<<x<<endl;
                x="";
                continue;
            }
        }
        x=x+s[i];
    }
    return 0;
}

by Nail9 @ 2024-08-01 21:54:09

@jcy666

  1. 不要用 cin 读入,如果某密码中含有空格,空格后的内容不会被 cin 读入
char chr;
string s = "";
while(scanf("%c", &chr) != EOF) {
    s.push_back(chr);
}
  1. a&&b&&c&&d&&e 有误:题目说“大写字母,小写字母和数字必须至少有其中两种”,而不是每种都必须有

by Nail9 @ 2024-08-01 22:01:09

@Nail9

btw,这道题数据量非常小,字符串最多100位,不用关闭同步流。

如果要关闭同步流,就不能用 scanf(),你可以用 getline(cin, s) 读入数据。


by jcy666 @ 2024-08-02 12:48:22

@Nail9 谢谢好心人


by Nail9 @ 2024-08-02 12:57:08

@jcy666 刚才的提交里第2点你没改,a&&b&&c&&d&&e 有误


by jcy666 @ 2024-08-02 21:02:24

@Nail9 啊?


by jcy666 @ 2024-08-02 21:08:52

#include<bits/stdc++.h>
using namespace std;
bool pd(string s){
    bool a=false,b=false,c=false,d=false,e=false;
    if(s.size()>=6&&s.size()<=12){
        a=true;
    }
    for(int i=0;i<s.size();i++){
        if(s[i]>='a'&&s[i]<='z'){
            b=true;
        }
        if(s[i]>='A'&&s[i]<='Z'){
            c=true;
        }
        if(s[i]>='0'&&s[i]<='9'){
            d=true;
        }
        if(s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'){
            e=true;
        }
    }
    bool bcd=false;
    int t;
    if(b) t++;
    if(c) t++;
    if(d) t++;
    if(t>=2){
        bcd=true;
    }
    if(bcd&&a&&e){
        return true;
    }
    return false;
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    string s,x="";
    getline(cin,s);
    for(int i=0;i<s.size();i++){
        if(s[i]==','){
            if(pd(x)){
                cout<<x<<endl;
                x="";
                continue;
            }
        }
        x=x+s[i];
    }
    return 0;
}

@Nail9


by Nail9 @ 2024-08-03 10:33:19

@jcy666

  1. 输入多个字符串,最后一个字符串不会被判断。样例点中123&^YUhg@!字符串没有经过pd()函数判断;
  2. 无论pd(x)是否为真,只要s[i]==',',都要执行x="";continue;。但是你把这段代码写在判断pd(x)是否为真里面了,应当放到外面;
  3. pd函数中,如果输入的字符串含有其他字符,这个字符串都是不合规的。

以下是更改后的 AC 代码:

#include<bits/stdc++.h>
using namespace std;
bool pd(string s){
    bool a=false,b=false,c=false,d=false,e=false,f=true; // 问题3初始化f为true
    if(s.size()>=6&&s.size()<=12){
        a=true;
    }
    for(int i=0;i<s.size();i++){
        if(s[i]>='a'&&s[i]<='z'){
            b=true;
        }
        else if(s[i]>='A'&&s[i]<='Z'){
            c=true;
        }
        else if(s[i]>='0'&&s[i]<='9'){
            d=true;
        }
        else if(s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'){
            e=true;
        }
        else f=false; // 问题3,注意前面的if前都要加上else
    }
    bool bcd=false;
    int t;
    if(b) t++;
    if(c) t++;
    if(d) t++;
    if(t>=2){
        bcd=true;
    }
    if(bcd&&a&&e&&f){
        return true;
    }
    return false;
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    string s,x="";
    getline(cin,s);
    for(int i=0;i<s.size();i++){
        if(s[i]==','||i==s.size()-1){ // 问题1
            if(pd(x)){
                cout<<x<<endl;
            }
            x=""; // 问题2
            continue;
        }
        x=x+s[i];
    }
    return 0;
}

|