题目的主要信息:
- 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分:
- 密码长度:
-
5 分: 小于等于4 个字符
-
10 分: 5 到7 字符
-
25 分: 大于等于8 个字符
-
- 字母:
-
0 分: 没有字母
-
10 分: 全都是小(大)写字母
-
20 分: 大小写混合字母
-
- 数字:
-
0 分: 没有数字
-
10 分: 1 个数字
-
20 分: 大于1 个数字
-
- 符号:
-
0 分: 没有符号
-
10 分: 1 个符号
-
25 分: 大于1 个符号
-
- 奖励:
-
2 分: 字母和数字
-
3 分: 字母、数字和符号
-
5 分: 大小写字母、数字和符号
-
- 根据得分输出如下:
得分 | 输出 |
---|---|
得分>= 90 | VERY_SECURE |
得分>= 80 | SECURE |
得分>= 70 | VERY_STRONG |
得分>= 60 | STRONG |
得分>= 50 | AVERAGE |
得分>= 25 | WEAK |
得分>= 0 | VERY_WEAK |
方法一:统计得分和
具体做法:
遍历输入的字符串,统计小写字母、大写字母、数字、其他字符出现的次数,然后分别根据长度、大小写字母情况,数字情况,字符情况,奖励情况累加得分,最后根据累加分数区间输出相应的结果。
注意,奖励得分需要从最严苛的开始判断,因为它们是相互包含关系。
#include<iostream>
#include<string>
using namespace std;
int cal_score(string& s){
int sum = 0;
int upletter = 0;
int lowletter = 0;
int digit = 0;
int other = 0;
for(int i = 0 ; i < s.length(); i++){ //遍历数组统计每种字符串出现的次数
if(s[i] >= 'a' && s[i] <= 'z')
lowletter++;
else if(s[i] >= 'A' && s[i] <= 'Z')
upletter++;
else if(s[i] >= '0' && s[i] <= '9')
digit++;
else
other++;
}
if(s.length() <= 4) //长度的分
sum += 5;
else if(s.length() <= 7)
sum += 10;
else
sum += 25;
if(upletter == 0 || lowletter == 0) //字母得分
sum += 10;
else if(upletter > 0 && lowletter > 0)
sum += 20;
if(digit == 1) //数字得分
sum += 10;
else if(digit > 1)
sum += 20;
if(other == 1) //符号得分
sum += 10;
else if(other > 1)
sum += 25;
if(upletter > 0 && lowletter > 0 && digit > 0 && other > 0) //奖励得分
sum += 5;
else if(upletter + lowletter > 0 && digit > 0 && other > 0)
sum += 3;
else if(upletter + lowletter > 0 && digit > 0)
sum += 2;
return sum;
}
int main(){
string s;
while(cin >> s){
int score = cal_score(s); //计算得分
switch(score / 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:{ //50以下两种情况
if(score >= 25)
cout << "WEAK" << endl;
else
cout << "VERY_WEAK" << endl;
}
}
}
return 0;
}
复杂度分析:
- 时间复杂度:,遍历一次字符串,其他都是判断
- 空间复杂度:,无额外空间
方法二:类
具体做法:
我们可以用一个类封装这个字符串,用输入的字符串初始化这个密码类,同时统计小写字母、大写字母、数字、其他字符出现的次数。后续每种情况都是一个成员函数,在主函数中调用成员函数累加即可计算得分,根据得分区间输出即可。
#include<iostream>
#include<string>
using namespace std;
class password_score{
private:
string password;
int upletter = 0;
int lowletter = 0;
int digit = 0;
int other = 0;
public:
void init(string s){
this->password = s; //初始化类的字符串
for(int i = 0; i < s.length(); i++){ //遍历数组统计每种字符串出现的次数
if(s[i] >= 'a' && s[i] <= 'z')
this->lowletter++;
else if(s[i] >= 'A' && s[i] <= 'Z')
this->upletter++;
else if(s[i] >= '0' && s[i] <= '9')
this->digit++;
else
this->other++;
}
}
int length_fun(){ //长度的分
if(this->password.length() <= 4)
return 5;
else if(this->password.length() <= 7)
return 10;
return 25;
}
int alpha_fun(){
if(this->upletter == 0 || this->lowletter == 0) //字母得分
return 10;
else if(this->upletter > 0 && this->lowletter > 0)
return 20;
return 0;
}
int digit_fun(){
if(this->digit == 1) //数字得分
return 10;
else if(this->digit > 1)
return 20;
return 0;
}
int other_fun(){
if(this->other == 1) //符号得分
return 10;
else if(this->other > 1)
return 25;
return 0;
}
int award_fun(){
if(this->upletter > 0 && this->lowletter > 0 && this->digit > 0 && this->other > 0) //奖励得分
return 5;
else if(this->upletter + this->lowletter > 0 && this->digit > 0 && this->other > 0)
return 3;
else if(this->upletter + this->lowletter > 0 && this->digit > 0)
return 2;
return 0;
}
};
int main(){
string s;
while(cin >> s){
password_score pw; //构建一个密码类
pw.init(s); //用输入的字符串初始化
int score = pw.alpha_fun() + pw.award_fun() + pw.digit_fun() + pw.length_fun() + pw.other_fun();
switch(score / 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:{ //50以下两种情况
if(score >= 25)
cout << "WEAK" << endl;
else
cout << "VERY_WEAK" << endl;
}
}
}
return 0;
}
复杂度分析:
- 时间复杂度:,初始化字符串的时候需要遍历,其余都是判断
- 空间复杂度:,构建类的构建是常熟空间