华为机试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:密码强度等级的主要内容,如果未能解决你的问题,请参考以下文章