B3843 [GESP202306 三级] 密码合规 题解

先看一下本题的题目描述:

题目描述

网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。

  1. 只能由 a∼za∼z 之间 2626 个小写字母、A∼ZA∼Z 之间 2626 个大写字母、0∼90∼9 之间 1010 个数字以及 !@#$四个特殊字符构成。

  2. 密码最短长度 :6:6 个字符,密码最大长度 :12:12 个字符。

  3. 大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。

输入格式

输入一行不含空格的字符串。约定长度不超过 100100。该字符串被英文逗号分隔为多段,作为多组被检测密码。

输出格式

输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。

输入输出样例

输入 #1复制

seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

输出 #1复制

seHJ12!@
sjdkffH$123

说明/提示

【样例 1 解释】

输入被英文逗号分为了四组被检测密码:seHJ12!@sjdkffH$123sdf!@&12HDHa!123&^YUhg@!。其中 sdf!@&12HDHa! 长度超过 12 个字符,不合规;123&^YUhg@! 包含四个特殊字符之外的字符不合规。

根据题目描述,可以得出一个大致思路:定义一个字符串a,通过for循环,进行一个判断:a[i]是否为','。如果a[i]==',',直接开始计数,判断小写字母,大写字母,数字,符号等各出现了多少次。否则,直接判断输出,记得重置所有的变量。

ok啊,直接上AC代码!本题只是字符串基础,就不过多讲解了。

#include<bits/stdc++.h>
using namespace std;
int main(){    
    //定义变量,初始化
    string a,b;
    int da,xiao,shu,fu,else_;
    da=xiao=shu=fu=else_=0;
    cin>>a;
    a+=','; //给a补充一个',',否则判断不到最后一个
    for(int i=0;i<=a.size();i++){
        //计数
        if(a[i]!=','){
            if(a[i]>='a' && a[i]<='z'){
                xiao++;
            }
            else if(a[i]>='A' && a[i]<='Z'){
                da++;
            }
            else if(a[i]>='0' && a[i]<='9'){
                shu++;
            }
            else if(a[i]=='@' || a[i]=='!' || a[i]=='#' || a[i]=='$'){
                fu++;
            }
            //不要忘记判断其他情况
            else{
                else_++;
            }
            b+=a[i];
        }
        else{
            b+='\0'; //结尾必须为'\0'
            //调试
            //cout<<da<<" "<<xiao<<" "<<shu<<" "<<fu<<" "<<else_<<" "<<b<<endl; 
            if(fu>=1 && else_==0){ //判断
                if((da>0 && shu>0) || (xiao>0 && shu>0) || (da>0 && xiao>0)){
                    if(b.size()>=7 && b.size()<=13){
                        cout<<b<<endl;
                    }
                }
            }
            //重置
            b=""; 
            da=xiao=shu=fu=0;
            else_=0;
            //重置
        }
    }
    return 0;
}

 本题可以进行优化,欢迎大佬来点评

完结撒花🎇

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值