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

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

题目描述:

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

一、密码长度:


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;
}


相关文章
|
存储 算法 分布式数据库
【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)
【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)
374 0
|
存储 文件存储 Windows
简单好用的免费数据恢复软件EasyRecovery
EasyRecovery是Ontrack公司出品的一个硬盘数据恢复软件,能够帮你恢复丢失的数据以及重建文件系统。它提供了完善的数据恢复解决方案,比如删除文件恢复、格式化恢复、分区丢失恢复。在EasyRecovery 14专业版本中,还可以创建恢复盘和克隆盘,实现整盘的数据恢复及系统迁移。
1023 0
|
Linux
LINUX CUPS下载源码并编译
LINUX CUPS下载源码并编译
743 0
|
11月前
|
运维 Kubernetes Cloud Native
云原生时代下的应用部署与管理
【10月更文挑战第38天】在数字化浪潮中,云原生技术正引领着软件开发和运维的革命。本文将探讨云原生的核心概念、优势以及如何通过代码示例实现应用的快速部署和管理,旨在为读者提供一套清晰的云原生应用部署和管理的实践指南。
|
11月前
|
前端开发 C# Windows
在WPF程序中实现PropertyGrid功能
【11月更文挑战第15天】PropertyGrid 是一个用户界面组件,用于直观地查看和编辑对象属性。在 WPF 中可通过组合 Expander 和 DataGrid 实现基本功能,或使用第三方库 PropertyTools 获得更强大特性,包括属性验证和类型特定编辑器。
695 3
|
网络协议 安全 Linux
【题目】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷
【题目】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷
【题目】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷
|
NoSQL 应用服务中间件 Linux
宝塔linux面板命令大全
宝塔linux面板命令大全
249 2
|
安全 Java API
阿里云登录入口
本文讲解一下阿里云登录入口
|
安全 API Android开发
RK3326 android10.0(Q) OTA 实战
RK3326 android10.0(Q) OTA 实战
855 0
RK3326 android10.0(Q) OTA 实战
|
Shell 开发工具 git
如何将自己的代码提交到码云
如何将自己的代码提交到码云