华为机试HJ87:密码强度等级

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ87:密码强度等级相关的知识,希望对你有一定的参考价值。

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

一、密码长度:

5 分: 小于等于4 个字符

10 分: 5 到7 字符

25 分: 大于等于8 个字符

二、字母:

0 分: 没有字母

10 分: 全都是小(大)写字母

20 分: 大小写混合字母

三、数字:

0 分: 没有数字

10 分: 1 个数字

20 分: 大于1 个数字

四、符号:

0 分: 没有符号

10 分: 1 个符号

25 分: 大于1 个符号

五、奖励:

2 分: 字母和数字

3 分: 字母、数字和符号

5 分: 大小写字母、数字和符号

最后的评分标准:

>= 90: 非常安全

>= 80: 安全(Secure)

>= 70: 非常强

>= 60: 强(Strong)

>= 50: 一般(Average)

>= 25: 弱(Weak)

>= 0:  非常弱

对应输出为:

VERY_SECURE

SECURE

VERY_STRONG

STRONG

AVERAGE

WEAK

VERY_WEAK

请根据输入的密码字符串,进行安全评定。

注:

字母:a-z, A-Z

数字:0-9

符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)

!"#$%&'()*+,-./     (ASCII码:0x21~0x2F)

:;<=>?@             (ASCII码:0x3A~0x40)

[\\]^_`              (ASCII码:0x5B~0x60)

{|}~                (ASCII码:0x7B~0x7E)

提示:

1 <= 字符串的长度<= 300

输入描述:

本题含有多组输入样例。
每组样例输入一个string的密码

输出描述:

每组样例输出密码等级

示例:

输入:

38$@NoNoNo
123

输出:

VERY_SECURE
WEAK

说明:

第一组样例密码强度为95分。
第二组样例密码强度为25分。

解题思路:

这题是字符串分析题。首先分析密码长度,进行加分;再遍历一遍,遍历过程中统计数字、大小写字母和符号的相关信息;按照标准进行加分;最后按照分数输出不同string结果,完成。

测试代码:

#include <iostream>
#include <string>

using namespace std;

string SecurityLevel(string password)
{
    int sum=0;
    int size=password.size();
    // 密码长度
    if(size<=4)
        sum+=5;
    else if(size>4&&size<=7)
        sum+=10;
    else
        sum+=25;
    // 遍历
    bool noletter=true;
    bool haveupper=false;
    bool haveLower=false;
    bool havenumber=false;
    bool havesymbol=false;
    int numsize=0;
    int symbolsize=0;
    for(int i=0;i<size;++i)
    {
        if(password[i]>='0'&&password[i]<='9')
        {
            numsize++;
            havenumber=true;
        }
        else if(password[i]>='a'&&password[i]<='z')
        {
            noletter=false;
            haveLower=true;
        }
        else if(password[i]>='A'&&password[i]<='Z')
        {
            noletter=false;
            haveupper=true;
        }
        else{
            symbolsize++;
            havesymbol=true;
        }
    }
    // 字母
    if(haveupper&&haveLower)
        sum+=20;
    else if((haveupper&&!haveLower)||(!haveupper&&haveLower))
        sum+=10;
    // 数字
    if(numsize>1)
        sum+=20;
    else if(numsize==1)
        sum+=10;
    // 数字
    if(symbolsize>1)
        sum+=25;
    else if(symbolsize==1)
        sum+=10;
    // 奖励
    if(haveupper&&haveLower&&havenumber&&havesymbol)
        sum+=5;
    else if(!noletter&&havenumber&&havesymbol)
        sum+=3;
    else if(!noletter&&havenumber)
        sum+=2;
    //结果
    if(sum>=90)
        return "VERY_SECURE";
    else if(sum>=80)
        return "SECURE";
    else if(sum>=70)
        return "VERY_STRONG";
    else if(sum>=60)
        return "STRONG";
    else if(sum>=50)
        return "AVERAGE";
    else if(sum>=25)
        return "WEAK";
    else
        return "VERY_WEAK";
}

int main()
{
    string password;
    while(getline(cin,password))
    {
        cout<<SecurityLevel(password)<<endl;
    }
    return 0;
}

以上是关于华为机试HJ87:密码强度等级的主要内容,如果未能解决你的问题,请参考以下文章

华为机试题 HJ87密码强度等级

华为机试题 HJ87密码强度等级

华为机试-密码强度等级

华为机试HJ21:简单密码

华为机试HJ32:密码截取

华为机试HJ20:密码验证合格程序