题目的主要信息:
密码按如下规则进行:
一、密码长度:
- 5 分: 小于等于4 个字符
- 10 分: 5 到7 字符
- 25 分: 大于等于8 个字符
二、字母:
- 0 分: 没有字母
- 10 分: 全都是小(大)写字母
- 20 分: 大小写混合字母
三、数字:
- 0 分: 没有数字
- 10 分: 1 个数字
- 20 分: 大于1 个数字
四、符号:
- 0 分: 没有符号
- 10 分: 1 个符号
- 25 分: 大于1 个符号
五、奖励:
- 2 分: 字母和数字
- 3 分: 字母、数字和符号
- 5 分: 大小写字母、数字和符号
最后根据得分得到密码强度等级。
方法一:
遍历一遍输入的字符串:
- 根据密码长度计算得分。
- 统计小写字母、大写字母、数字、其他字符出现的次数。
- 计算字母得分。
- 计算数字得分。
- 计算字符得分。
- 计算奖励得分。
- 根据分数输出相应的结果。 具体做法:
#include<iostream>
#include<string>
#include <cstdio>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
int score=0;//分数
//密码长度
if(s.size()<=4){
score+=5;
}else if(s.size()>=8){
score+=25;
}else{
score+=10;
}
//字母 数字 符号个数
int lower=0,upper=0,digit=0,symbol=0,judge_zm=0,judge_fh=0;
for(int i=0;i<s.size();i++){
if(islower(s[i])){//小写字母
lower++;
}else if(isupper(s[i])){//大写字母
upper++;
}else if(isdigit(s[i])){//数字
digit++;
}else{//符号
symbol++;
}
}
//字母
if((lower >0 && upper==0)||(lower ==0 && upper>0)){//全都是小(大)写字母
score+=10;
}else if(lower>0 && upper>0){//大小写混合字母
score+=20;
}
//数字
if(digit==1){//1个数字
score+=10;
}else if(digit>1){//大于1个数字
score+=20;
}
//符号
if(symbol==1){//1个符号
score+=10;
}else if(symbol>1){//大于1个符号
score+=25;
}
//奖励
if(lower>0 && upper>0 && digit>0 && symbol>0){//大小写字母、数字、符号
score+=5;
}else if((lower>0||upper>0) && (digit>0) && (symbol>0)){//字母、数字、符号
score+=3;
}else if((lower>0||upper>0) && (digit>0)){//字母和数字
score+=2;
}
if(score>=90){
cout<<"VERY_SECURE"<<endl;
}else if(score>=80){
cout<<"SECURE"<<endl;
}else if(score>=70){
cout<<"VERY_STRONG"<<endl;
}else if(score>=60){
cout<<"STRONG"<<endl;
}else if(score>=50){
cout<<"AVERAGE"<<endl;
}else if(score>=25){
cout<<"WEAK"<<endl;
}else{
cout<<"VERY_WEAK"<<endl;
}
}
return 0;
}
复杂度分析:
- 时间复杂度:,没有循环,只进行简单判断。
- 空间复杂度:,只用了常数空间。
方法二:
创建一个PW类,将所有计算密码得分的方法都封装成PW类的一个函数,计算密码强度等级的时候,首先调用各个分数计算函数累积起来,最后对总得分按范围划分等级。
具体做法:
#include<iostream>
#include<string>
using namespace std;
class PW{
private:
string password;
int upper = 0;
int lower = 0;
int digit = 0;
int symbol = 0;
public:
void init(string s){
this->password = s;
for(int i = 0; i < s.size(); i++){ //统计大小写字母、数字、符号出现的次数
if(islower(s[i])){//小写字母
this->lower++;
}else if(isupper(s[i])){//大写字母
this->upper++;
}else if(isdigit(s[i])){//数字
this->digit++;
}else{//符号
this->symbol++;
}
}
}
int scoreOfLen(){ //计算长度得分
if(this->password.size() <= 4)
return 5;
else if(this->password.size() <= 7)
return 10;
return 25;
}
int scoreOfAlpha(){//计算字母得分
if(this->upper == 0 || this->lower == 0){
return 10;
}
else if(this->upper > 0 && this->lower > 0){
return 20;
}
return 0;
}
int scoreOfDigit(){//计算数字得分
if(this->digit == 1)
return 10;
else if(this->digit > 1)
return 20;
return 0;
}
int scoreOfSymbol(){//计算符号得分
if(this->symbol == 1){
return 10;
}
else if(this->symbol > 1){
return 25;
}
return 0;
}
int award(){//计算奖励分数
if(this->upper > 0 && this->lower > 0 && this->digit > 0 && this->symbol > 0)//同时有大小写字母、数字、符号
return 5;
else if(this->upper + this->lower > 0 && this->digit > 0 && this->symbol > 0)//有字母、数字、符号
return 3;
else if(this->upper + this->lower > 0 && this->digit > 0)//有字母、数字
return 2;
return 0;
}
};
int main(){
string s;
while(cin >> s){
PW str;
str.init(s);
int score = str.award() + str.scoreOfLen() + str.scoreOfAlpha() + str.scoreOfDigit() + str.scoreOfSymbol();//计算总分
//按照分数输出对应的密码强度等级
if(score>=90){
cout<<"VERY_SECURE"<<endl;
}else if(score>=80){
cout<<"SECURE"<<endl;
}else if(score>=70){
cout<<"VERY_STRONG"<<endl;
}else if(score>=60){
cout<<"STRONG"<<endl;
}else if(score>=50){
cout<<"AVERAGE"<<endl;
}else if(score>=25){
cout<<"WEAK"<<endl;
}else{
cout<<"VERY_WEAK"<<endl;
}
}
return 0;
}
复杂度分析:
- 时间复杂度:,没有循环,只进行简单判断。
- 空间复杂度:,只用了常数空间。