题解 | #密码强度等级#
密码强度等级
https://www.nowcoder.com/practice/52d382c2a7164767bca2064c1c9d5361
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
//密码长度得分
int password_size(string s) {
if (s.size() <= 4) {
return 5;
} else if (s.size() > 4 && s.size() < 8) {
return 10;
} else {
return 25;
}
}
//密码字母得分
int password_alpha(string s) {
int sum_loweralpha = 0, sum_upperalpha = 0;
for (int i = 0; i < 26; i++) {
sum_loweralpha += count(s.begin(), s.end(), 'a' + i);
sum_upperalpha += count(s.begin(), s.end(), 'A' + i);
}
if (sum_loweralpha == 0 && sum_upperalpha == 0) {
return 0;
} else if (sum_loweralpha != 0 && sum_upperalpha != 0) {
return 20;
} else {
return 10;
}
}
//密码数字得分
int password_num(string s) {
int sum_num = 0;
string t = "0123456789";
for (auto it = t.begin(); it < t.end(); ++it) {
sum_num += count(s.begin(), s.end(), *it);
}
if (sum_num == 0) {
return 0;
} else if (sum_num == 1) {
return 10;
} else {
return 20;
}
}
//密码符号得分
int password_signal(string s) {
string t("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~");//注意两处转义字符:\"和\\
int sum_signal = 0;
for (auto it = t.begin(); it < t.end(); ++it) {
sum_signal += count(s.begin(), s.end(), *it);
}
if (sum_signal == 0) {
return 0;
} else if (sum_signal == 1) {
return 10;
} else {
return 25;
}
}
//奖励得分,注意if-else语句要把“难”的条件放在前面
int reward(string s) {
if (password_alpha(s) == 20 && password_num(s) != 0 &&
password_signal(s) != 0) {
return 5;
} else if (password_alpha(s) != 0 && password_num(s) != 0 &&
password_signal(s) != 0) {
return 3;
} else if (password_alpha(s) != 0 && password_num(s) != 0) {
return 2;
} else {
return 0;//不可省略,否则奖励得分会出错
}
}
int main() {
string s;
getline(cin, s);
int size_score, alpha_score, num_score, signal_score, rew;
size_score = password_size(s);
alpha_score = password_alpha(s);
num_score = password_num(s);
signal_score = password_signal(s);
rew = reward(s);
int sum = size_score + alpha_score + num_score + signal_score + rew;
if (sum >= 90) {
printf("VERY_SECURE\n");
} else if (sum >= 80) {
printf("SECURE\n");
} else if (sum >= 70) {
printf("VERY_STRONG\n");
} else if (sum >= 60) {
printf("STRONG\n");
} else if (sum >= 50) {
printf("AVERAGE\n");
} else if (sum >= 25) {
printf("WEAK\n");
} else {
printf("VERY_WEAK\n");
}
return 0;
}
使用count函数计算密码中字母、数字、符号出现的次数;在计算奖励分数的时候要记得把“难”的条件放在前面。

