首页 > 试题广场 >

密码安全等级

[编程题]密码安全等级
  • 热度指数:2159 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解

现公司要开发一个业务管理系统,要求注册环节的密码需要提示用户其安全等级,密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

       一、密码长度:

       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: 安全

       大于等于70: 非常强

       大于等于 60: 强

       大于等于 50: 一般

       大于等于 25: 弱

       大于等于0:  非常弱

 

对应输出为:

VERY_WEAK,

WEAK,    

AVERAGE,    

STRONG,     

VERY_STRONG,

SECURE,     

VERY_SECURE


输入描述:
输入一个自定义密码


输出描述:
输出对应安全等级
示例1

输入

dgsayd$%12

输出

SECURE
import java.util.*;
public class Main{
    public static void main(String[] args){
    Scanner sc=new Scanner(System.in);
    int res=0;
    String str=sc.next();
    if(str.length()<=4)res+=5;
    else if(str.length()<=7)res+=10;
    else res+=25;
    int flag1=0,flag2=0,flag3=0,flag4=0;
    for(int i=0;i<str.length();i++){
        if(Character.isDigit(str.charAt(i)))flag1++;
        if(Character.isLowerCase(str.charAt(i)))flag2++;
        if(Character.isUpperCase(str.charAt(i)))flag3++;
        if(!Character.isLetterOrDigit(str.charAt(i)))flag4++;
    }
    res+=((flag1==0)?0:((flag1==1)?10:20));
    res+=(flag2==0&&flag3==0)?0:((flag2>0&&flag3==0||flag3>0&&flag2==0)?10:20);   
    res+=flag4==0?0:((flag4==1)?10:25);
    res+=flag1>0&&(flag2>0||flag3>0)?2:0;
    res+=flag1>0&&(flag2>0||flag3>0)&&flag4>0?3:0;
    res+=flag1>0&&(flag2>0&&flag3>0)&&flag4>0?5:0;
    if(res>=90)System.out.println("VERY_SECURE");
    else if(res>=80)System.out.println("SECURE");
    else if(res>=70)System.out.println("VERY_STRONG");
    else if(res>=60)System.out.println("STRONG");
    else if(res>=50)System.out.println("AVERAGE");
    else if(res>=25)System.out.println("WEAK");
    else System.out.println("VERY_WEAK");  
    } 

发表于 2019-03-21 14:50:02 回复(1)
还是挺简单的,边界条件不要弄错就好
#include<iostream>
#include<cstring>
using namespace std;
int main() {
    char ch[50];
    cin >> ch;
    int grade = 0;
    int b = strlen(ch);
    switch (strlen(ch)) {
    case 0: grade = 5; break;
    case 1: grade = 5; break;
    case 2: grade = 5; break;
    case 3: grade = 5; break;
    case 4: grade = 5; break;
    case 5: grade = 10; break;
    case 6: grade = 10; break;
    case 7: grade = 10; break;
    default: grade = 25;
    }
    int a[4] = { 0,0,0,0 };//大写字母,小写字母,数字,符号
    for (int i = 0; i < strlen(ch); i++) {
        if ('a' <= ch[i] && ch[i] <= 'z')
            a[0]++;
        else if ('A' <= ch[i] && ch[i] <= 'Z')
            a[1]++;
        else if ('0' <= ch[i] && ch[i] <= '9')
            a[2]++;
        else a[3]++;
    }
    if (a[0] == 0 && a[1] == 0) grade += 0;
    else if (a[1] == 0 || a[0] == 0) grade += 10;
    else grade += 20;
    if (a[2] == 0) grade += 0;
    else if (a[2] == 1) grade += 10;
    else grade += 20;
    if (a[3] == 0) grade += 0;
    else if (a[3] == 1) grade += 10;
    else grade += 25;
    if ((a[1] > 0 && a[2] > 0) || (a[2] > 0 && a[0] > 0)) {
        grade += 2;
        if (a[3] > 0) {
            grade += 1;
            if (a[2] > 0 && a[1] > 0 && a[0] > 0)
                grade += 2;
        }
    }
    if (grade >= 90) cout << "VERY_SECURE" << endl;
    else if (grade < 90 && grade >= 80) cout << "SECURE" << endl;
    else if (grade < 80 && grade >= 70) cout << "VERY_STRONG" << endl;
    else if (grade < 70 && grade >= 60) cout << "STRONG" << endl;
    else if (grade < 60 && grade >= 50) cout << "AVERAGE" << endl;
    else if (grade < 50 && grade >= 25) cout << "WEAK" << endl;
    else if (grade >= 0 && grade < 25) cout << "VERY_WEAK" << endl;
}

发表于 2019-02-11 22:24:31 回复(1)
#include<iostream>
using namespace std;
string s[7]={"VERY_WEAK","WEAK","AVERAGE","STRONG","VERY_STRONG","SECURE","VERY_SECURE"};
int main()
{
    string psd;
    int a=0,lf=0,uf=0,df=0,f=0;
    cin>>psd;
    if(psd.length()<=4)    a+=5;
    else if(psd.length()>=8)    a+=25;
    else    a+=10;
    for(auto c:psd)
    {
        if(islower(c))    lf=1;
        else if(isupper(c))    uf=1;
        else if(isdigit(c))    df<2 ? df++:df=2;
        else f<2 ? f++:f=2;
    }
    if(df)
    {
        df==2 ? a+=20:a+=10;
        if(lf==1&&uf==1&&f==1)    a+=10;
        else if((lf==1||uf==1)&&f==1)    a+=5;
        else if(lf==1||uf==1)    a+=2;
    }
    f==2 ? a+=25:(f==1 ? a+=10:a+=0);
    uf+lf==2 ? a+=20:(lf+uf==1 ? a+=10:a+=0);
    a>=90 ? cout<<s[6]:(a>=80 ? cout<<s[5]:(a>=70 ? cout<<s[4]:(a>=60 ? cout<<s[3]:(a>=50 ? cout<<s[2]:(a>=25 ? cout<<s[1]:cout<<s[0])))));
}

发表于 2019-01-28 15:52:38 回复(0)
    Scanner sc = new Scanner(System.in);
              String s = sc.next();
        int len = s.length();
        int sum = 0;
        if(len <= 4){
            sum+=5;
        }else if(len >=5 && len <=7){
            sum+=10;
        }else{
            sum+=25;
        }
        int a =0 , b= 0 , c = 0, d = 0;
        for(int i = 0 ; i < s.length() ; i++){
            if(s.charAt(i) >= '0' && s.charAt(i) <='9'){
                a++;
            }else if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z'){
                b++;
            }else if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'){
                c++;
            }else{
                d++;
            }
        }
       if(b!=0 && c!=0){
           sum = sum +25;
       }else if(b != 0 || c!=0){
           sum = sum+10;
       }
       
        if(a ==0){
            sum = sum +0;
        }else if(a ==1){
            sum = sum+10;
        }else{
            sum = sum+20;
        }
        if(d ==0){
            sum = sum +0;
        }else if(d == 1 ){
            sum = sum +10;
        }else{
            sum+=25;
        }
        if(b+a == s.length() || c+a == s.length() ){
            sum = sum+2;
        }else if(b+a+d == s.length() || c+a+d == s.length()){
            sum = sum+3;
        }else if(a+b+c+d == s.length()){
            sum = sum + 5;
        }
        if(sum >=90){
           System.out.println("VERY_SECURE");
            
        }else if(sum >=80){
            System.out.println("SECURE");
          
        }else if(sum >=70){
            System.out.println("VERY_STRONG");
             
        }else if(sum >=60){
            System.out.println("STRONG");
            
        }else if(sum >=50){
            System.out.println("AVERAGE");
            
        }else if(sum >=25){
            System.out.println("WEAK");
          
        }else{
            
            System.out.println("VERY_WEAK");
            
        }

发表于 2021-06-03 15:54:15 回复(0)
public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int count = 0;
        HashMap<String, Integer> map = new HashMap<>();
        map.put("number", 0);
        map.put("upper", 0);
        map.put("lower", 0);
        map.put("other", 0);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= '0' && c <= '9') {
                map.put("number", map.get("number") + 1);
            } else if (c >= 'A' && c <= 'Z') {
                map.put("upper", map.get("upper") + 1);
            } else if (c >= 'a' && c <= 'z') {
                map.put("lower", map.get("lower") + 1);
            } else {
                map.put("other", map.get("other") + 1);
            }
        }
        /*
        一、密码长度:
           5 分: 小于等于4 个字符
           10 分: 5 到7 字符
           25 分: 大于等于8 个字符
         */
        if (s.length() <= 4) {
            count = count + 5;
        } else if (s.length() >= 5 && s.length() <= 7) {
            count = count + 10;
        } else {
            count = count + 25;
        }
        int number = map.get("number");
        int upper = map.get("upper");
        int lower = map.get("lower");
        int other = map.get("other");
        /*
        二、字母:
           0 分: 没有字母
           10 分: 全都是小(大)写字母
           20 分: 大小写混合字母
         */
        if (upper == 0 && lower == 0) {
            count += 0;
        } else {
            if (upper * lower == 0) {
                count += 10;
            } else if (upper > 0 && lower > 0) {
                count += 20;
            }
        }
        /*
        三、数字:
           0 分: 没有数字
           10 分: 1 个数字
           20 分: 大于1 个数字
         */
        if (number == 0) {
            count += 0;
        } else if (number == 1) {
            count += 10;
        } else {
            count += 20;
        }
        /*
        四、符号:
           0 分: 没有符号
           10 分: 1 个符号
           25 分: 大于1 个符号
         */
        if (other == 0) {
            count += 0;
        } else if (count == 1) {
            count += 10;
        } else {
            count += 25;
        }
        /*
        五、奖励:
           2 分: 字母和数字
           3 分: 字母、数字和符号
           5 分: 大小写字母、数字和符号
         */
        if ((upper + lower) > 0 && number > 0 && other == 0) {
            count += 2;
        } else if (upper * lower == 0 && number > 0 && other > 0) {
            count += 3;
        } else if (upper > 0 && lower > 0 && number > 0 && other > 0) {
            count += 5;
        }
        /*
            最后的评分标准:
           大于等于90: 非常安全
           大于等于80: 安全
           大于等于70: 非常强
           大于等于 60: 强
           大于等于 50: 一般
           大于等于 25: 弱
           大于等于0:  非常弱
            对应输出为:
            VERY_WEAK,
            WEAK,
            AVERAGE,
            STRONG,
            VERY_STRONG,
            SECURE,
            VERY_SECURE
         */
        if (count >= 90) {
            System.out.println("VERY_SECURE");
        } else if (count >= 80) {
            System.out.println("SECURE");
        } else if (count >= 70) {
            System.out.println("VERY_STRONG");
        } else if (count >= 60) {
            System.out.println("STRONG");
        } else if (count >= 50) {
            System.out.println("AVERAGE");
        } else if (count >= 25) {
            System.out.println("WEAK");
        } else {
            System.out.println("VERY_WEAK");
        }
    }
}

发表于 2019-04-11 19:44:45 回复(0)
#include<iostream>
#include<string>
#include<vector>
using std::string;
using std::vector;
int main()
{
 int score=0;
 int flag1=0;
 int flag2=0;
 int flagnum=0;
 int flagpunct=0;
 string code;
 std::cin>>code;
 if(code.size()<=4)score+=5;
 else if(code.size()>4&&code.size()<8)score+=10;
 else score+=25;
 for(auto c:code)
 {
  if(isupper(c))flag1=1;
  if(islower(c))flag2=1;
  if(isdigit(c))flagnum++;
  if(ispunct(c))flagpunct++;
 }
 if(flag1+flag2==2)score+=20;
 else if(flag1+flag2==1)score+=10;
 if(flagnum==1)score+=10;
 else if(flagnum>1)score+=20;
 if(flagpunct==1)score+=10;
 else if(flagpunct>1)score+=25;
 if((flag1||flag2)&&flagnum)
 {
  score+=2;
  if(flagpunct)
  {
   score+=1;
   if(flag1&&flag2&&flagnum&&flagpunct)
   {
    score+=2;
   }
  }
 }
 if(score>=90)std::cout<<"VERY_SECURE"<<std::endl; 
 else if(score>=80&&score<90)std::cout<<"SECURE"<<std::endl; 
 else if(score>=70&&score<80)std::cout<<"VERY_STRONG"<<std::endl; 
 else if(score>=60&&score<70)std::cout<<"STRONG"<<std::endl; 
 else if(score>=50&&score<60)std::cout<<"AVERAGE"<<std::endl; 
 else if(score>=25&&score<50)std::cout<<"WEAK"<<std::endl; 
 else if(score>=0&&score<25)std::cout<<"VERY_WEAK"<<std::endl; 
 return 0;//字符串范围for遍历
}

发表于 2019-02-16 14:33:33 回复(0)
请问大佬们这个是怎么回事啊?
发表于 2019-01-24 18:40:05 回复(8)
比较简单,主要是对很多类别的管理,不然很容易被许多的if-else弄晕,直接上代码
```java
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String pwd = sc.next();
        int score = 0;
        int c = 0; // 字母长度
        int num = 0; // 数字长度
        int mark = 0; // 符号长度
        int[] book = new int[4]; // 0, 1, 2, 3分别对应数字、符号,小写,大写(字幕则是大小写与)
        int length = pwd.length();
        for (int i = 0; i < length; i++) {
            char cc = pwd.charAt(i);
            if ('0' <= cc && cc <= '9') {
                book[0] = 1;
                num++;
            } else if ( 'a' <= cc && cc <= 'z') {
                book[2] = 1;
                c++;
            } else if ('A' <= cc && cc <= 'Z') {
                book[3] = 1;
                c++;
            } else { // 符号的情况
                book[1] = 1;
                mark++;
            }
        }
        // 密码长度
        if (length <= 4) {
            score += 5;
        } else if (length <= 7) {
            score += 10;
        } else if (length >= 8) {
            score += 25;
        }
        // 字母
        if (c < 1) {
            score += 0;
        } else if (book[2] + book[3] == 1) {
            score += 10;
        } else if (book[2] + book[3] == 2) {
            score += 20;
        }
        // 数字
        if (num < 1) {
            score += 0;
        } else if (num == 1) {
            score += 10;
        } else if (num > 1) {
            score += 20;
        }
        // 符号
        if (mark < 1) {
            score += 0;
        } else if (mark == 1) {
            score += 10;
        } else if (mark > 1) {
            score += 25;
        }
        // 奖励
        if (book[2] + book[0] == 2 || book[3] + book[0] == 2) {
            score += 2;
        } else if (book[0] + book[1] + book[2] == 3 || book[0] + book[1] + book[3] == 3) {
            score += 3;
        } else if (book[0] + book[1] + book[2] + book[3] == 4) {
            score += 5;
        }
        // 输出
        if (score >= 90) {
            System.out.println("VERY_SECURE");
        } else if (score >= 80) {
            System.out.println("SECURE");
        } else if (score >= 70) {
            System.out.println("VERY_STRONG");
        } else if (score >= 60) {
            System.out.println("STRONG");
        } else if (score >= 50) {
            System.out.println("AVERAGE");
        } else if (score >= 25) {
            System.out.println("WEAK");
        } else {
            System.out.println("VERY_WEAK");
        }
    }
}

```
发表于 2019-01-23 23:27:02 回复(3)
import java.io.IOException;
import java.util.Scanner;

/**
 * @author wylu
 */
public class Main {
    static final String VERY_WEAK = "VERY_WEAK";
    static final String WEAK = "WEAK";
    static final String AVERAGE = "AVERAGE";
    static final String STRONG = "STRONG";
    static final String VERY_STRONG = "VERY_STRONG";
    static final String SECURE = "SECURE";
    static final String VERY_SECURE = "VERY_SECURE";

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        String pwd = scanner.next();

        int score = cal(pwd);
        String res = VERY_WEAK;
        if (score >= 90) res = VERY_SECURE;
        else if (score >= 80) res = SECURE;
        else if (score >= 70) res = VERY_STRONG;
        else if (score >= 60) res = STRONG;
        else if (score >= 50) res = AVERAGE;
        else if (score >= 25) res = WEAK;
        System.out.println(res);
    }

    private static int cal(String pwd) {
        int len = pwd.length();
        int lowerCount = 0, upperCount = 0;
        int digitCount = 0, symbolCount = 0;
        for (int i = 0; i < pwd.length(); i++) {
            char ch = pwd.charAt(i);
            if (ch >= '0' && ch <= '9') digitCount++;
            else if (ch >= 'a' && ch <= 'z') lowerCount++;
            else if (ch >= 'A' && ch <= 'Z') upperCount++;
            else symbolCount++;
        }

        int lenScore = 25;
        if (len <= 4) lenScore =  5;
        else if (len <= 7) lenScore = 10;

        int letterScore = 20;
        if (lowerCount + upperCount == 0) letterScore = 0;
        else if (lowerCount == 0 || upperCount == 0) letterScore = 10;

        int digitScore = 20;
        if (digitCount == 0) digitScore = 0;
        else if (digitCount == 1) digitScore = 10;

        int symbolScore = 25;
        if (symbolCount == 0) symbolScore = 0;
        else if (symbolCount == 1) symbolScore = 10;

        int rewardScore = 0;
        if (lowerCount > 0 && upperCount > 0 && digitCount > 0 && symbolCount > 0) rewardScore = 5;
        else if (letterScore > 0 && digitCount > 0 && symbolScore > 0) rewardScore = 3;
        else if (letterScore > 0 && digitCount > 0) rewardScore = 2;

        return lenScore + letterScore + digitScore + symbolScore + rewardScore;
    }
}

发表于 2019-01-17 17:41:41 回复(0)
没有多想,每个判断一个静态方法
import java.util.Scanner;
public class Main{
    public static int isPasswdLength(String s){
        /**
        密码长度得分
        */
        if(s.length() <= 4){
            return 5;
        }else if(s.length() >=5 && s.length()<=7){
            return 10;
        }else{
            return 25;
        }
    }
    
    public static int hasAlphabet(String s){
        /**
        密码字母得分
        */
        int flag1=0;
        int flag2=0;
        for(int i=0;i < s.length();i++){
            char t = s.charAt(i);
            if(t > 'a' && t < 'z'){
                flag1 = 1;
            }
            if(t > 'A' && t < 'Z'){
                flag2 = 1;
            }
        }
        if(flag1 + flag2 == 2){
            return 20;
        }else if(flag1 + flag2 == 1){
            return 10;
        }else{
            return 0;
        }
    }
    
    public static int hasNumber(String s){
        /**
        密码数字得分
        */
        int flag1=0;
        for(int i=0;i < s.length();i++){
            char t = s.charAt(i);
            if(t >= '0' && t <= '9'){
                flag1++;
            }
        }
        if(flag1 > 1){
            return 20;
        }else if(flag1 == 1){
            return 10;
        }else{
            return 0;
        }
    }
    
    public static int hasOther(String s){
        /**
        密码符号得分
        */
        int flag1=0;
        for(int i=0;i < s.length();i++){
            char t = s.charAt(i);
            String str = t + "";
            if(hasAlphabet(str)==0 && hasNumber(str)==0){
                flag1++;
            }
        }
        if(flag1 > 1){
            return 25;
        }else if(flag1 == 1){
            return 10;
        }else{
            return 0;
        }
    }
    
    public static int hasReward(String s){
        /**
        密码奖励得分
        */
        if(hasAlphabet(s)==20 && hasNumber(s)>0 && hasOther(s)>0){
            return 5;
        }else if(hasAlphabet(s)>0 && hasNumber(s)>0 && hasOther(s)>0){
            return 3;
        }else if(hasAlphabet(s)>0 && hasNumber(s)>0){
            return 2;
        }else{
            return 0;
        }
    }
    
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int level = 0;
        level=isPasswdLength(s)+hasAlphabet(s)+hasNumber(s)+hasOther(s)+hasReward(s);
        if(level >= 90){
            System.out.println("VERY_SECURE");
        }else if(level >= 80){
            System.out.println("SECURE");
        }else if(level >= 70){
            System.out.println("VERY_STRONG");
        }else if(level >= 60){
            System.out.println("STRONG");
        }else if(level >= 50){
            System.out.println("AVERAGE");
        }else if(level >= 25){
            System.out.println("WEAK");
        }else{
            System.out.println("VERY_WEAK");
        }
    }
}

发表于 2019-01-17 17:24:47 回复(0)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LENTH 1001
int Else(char *pt);
int Add(char *pt); 
int Alpha(char *pt);
int Lenth(char *pt);
int Digit(char *pt);
int main(void)
{
    char words[MAX_LENTH];
    int sum = 0;
    
    scanf("%s", words);
    sum += Lenth(words) + Else(words) + Alpha(words) + Add(words) + Digit(words);
    switch(sum/10)
    {
        case 10:
        case 9:puts("VERY_SECURE");break;
        case 8:puts("SECURE");break;
        case 7:puts("VERY_STRONG");break;
        case 6:puts("STRONG");break;
        case 5:puts("AVERAGE");break;
        default:if(sum>25)
            puts("WEAK");
            else
            puts("VERY_WEAK");
            break;
    }
    
    return 0;
}
int Lenth(char *pt)
{
    int len = strlen(pt);
    
    if(len <= 4)
        return 5;
    else if(len <= 7)
        return 10;
    else
        return 25;
}
int Digit(char *pt)
{
    int i;
    int count = 0;
    
    for(i=0;i<strlen(pt);i++)
        if(isdigit(pt[i]))
            count++;
            
    if(count == 0)
        return 0;
    else if(count == 1)
        return 10;
    else
        return 20;
}
int Alpha(char *pt)
{
    int i;
    int flag1 = 0, flag2 = 0;
    
    for(i=0;i<strlen(pt);i++)
    {
        if(isupper(pt[i]))
            flag1 = 1;
        else if(islower(pt[i]))
            flag2 = 1;
        
    }
    if(flag1 == 0 && flag2 == 0)
        return 0;
    else if(flag1 || flag2 )
        return 10;
    else
        return 20;
}
int Else(char *pt)
{
    int i;
    int count = 0;
    
    for(i=0;i<strlen(pt);i++)
    {
        if(isdigit(pt[i]) == 0 && isalpha(pt[i]) == 0)
            count++;
    }
    if(count == 0)
        return 0;
    else if(count == 1)
        return 10;
    else
        return 25;
}
int Add(char *pt)
{
    if(Alpha(pt) && Digit(pt))
        return 2;
    if(Alpha(pt) == 10 && Digit(pt) && Else(pt))
        return 3;
    if(Alpha(pt) == 20 && Digit(pt) && Else(pt))
        return 5;
    
    return 0;
}
发表于 2019-01-14 13:00:39 回复(0)

问题信息

上传者:小小
难度:
11条回答 4307浏览

热门推荐

通过挑战的用户

查看代码