【牛客】 [编程题]密码强度等级 C++

1.题目描述

链接https://www.nowcoder.com/questionTerminal/52d382c2a7164767bca2064c1c9d5361?pos=7&orderByHotValue=1

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

一、密码长度:

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,

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

2.思路分析

  1. 这个代码分开来写,就是将小写,大写,数字,字符分来来计数
  2. 写四个vector来分别计数
  3. 第一步:先算str的长度,然后根据长度算出对应分数
  4. 第二步:给小写,大写,数字,字符来计数
  5. 第三步:给四个vector 判断,算出对应的分数
  6. 算出奖励的分数
  7. 把这些分数相加,然后返回
  8. 主函数main进行对应的输出

3.代码实现

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int Password_strength(string str)
{
    int sum = 0;
    // 对应小写,大写,数字,字符
    // f赋初始值是为了之后判断的时候少判断,就是没有字母或者数字的时候就不用再次进行赋值为0
    int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0;
    // 分类接收大写,小写,数字,字符
    vector<char> v2, v3, v4, v5;
    
    // 防止输入空字符串(一般不会输入无效字符)
    if(str.size() <= 0)
        return 0;
    
    // 字符串长度
    if(str.size() <= 4)
        sum1 =5;
    else if(str.size() <= 7 && str.size() >= 5)
        sum1 = 10;
    else if(str.size() >= 8)
        sum1 = 25;
    
    // 小写,大写,数字,字符
    for(int i = 0; i < str.size(); i++)
    {
        if(str[i] >= 'a' && str[i] <= 'z')
            v2.push_back(str[i]);
        else if(str[i] >= 'A' && str[i] <= 'Z')
                v3.push_back(str[i]);
        else if(str[i] <= '9' && str[i] >= '0')
                v4.push_back(str[i]);
        else
                v5.push_back(str[i]);
    }
    // 这里其实可以不用len,只用在后面判断就行
    int len2 = v2.size(), len3 = v3.size(), len4 = v4.size(), len5 = v5.size();
    
    // 这里就是最后的判断,前面赋值为0 就是在这里起作用的
    if(len2 > 0)
        sum2 = 10;
    if(len3 > 0)
        sum3 = 10;
    if(len4 == 1)
        sum4 = 10;
    else if(len4 > 1)
        sum4 = 20;
    if(len5 == 1)
        sum5 = 10;
    else if(len5 > 1)
        sum5 = 25;
            
    // 奖励
    int sum6 = 0;
    if((len2 > 0 && len4 > 0) || (len3 > 0 && len4 > 0))
        sum6 = 2;
    else if((len2 > 0 && len4 > 0 && len5 > 0) || (len3 > 0 && len4 > 0 && len5 >0))
        sum6 = 3;
    else if(len2 > 0 && len3 > 0 && len4 > 0 && len5 > 0) 
        sum6 = 5;
    
    sum = sum1 + sum2 + sum3 + sum4 + sum5 + sum6;
    // 返回
    return sum;
}

int main()
{
    string str;
    while(cin >> str)
    {
        int sum = Password_strength(str);
        // switch 语句很方便
        // 这里处理的时候小心50-25那个点,到case 5那里,用dafault,然后直接判断sum的值是否大于等于25
        switch(sum / 10)
        {
            case 9 :cout << "VERY_SECURE" << endl;
                break;
            case 8 :cout << "SECURE" << endl;
                break;            
            case 7 :cout << "VERY_STRONG" << endl;
                break;            
            case 6 :cout << "STRONG" << endl;
                break;            
            case 5 :cout << "AVERAGE" << endl;
                break;
            default:
                {
                    if(sum >= 25)
                        cout << "WEAK" << endl;
                    else
                        cout << "VERY_WEAK" << endl;
                }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43967449/article/details/106685133