列表

详情


HJ20. 密码验证合格程序

描述

密码要求:

1.长度超过8位

2.包括大小写字母.数字.其它符号,以上四种至少三种

3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)

数据范围:输入的字符串长度满足

输入描述

一组字符串。

输出描述

如果符合要求输出:OK,否则输出NG

示例1

输入:

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000

输出:

OK
NG
NG
OK

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 320KB, 提交时间: 2021-01-30

#include <stdio.h>

int main()
{
    char str[128]={0};
    while(scanf("%s",str)==1)
    {
        //printf("%s\n",str);
        int len,A=0,a=0,b=0,c=0,flag=1;
        len=strlen(str);
        if(len<=8)
        {
            printf("NG\n");
            continue;
        }
        for(int i=0;i<len;i++)
        {
            if((str[i]>='a'&&str[i]<='z'))
            {
                a=1;
            }
            else if((str[i]>='A'&&str[i]<='Z'))
            {
                A=1;
            }
            else if(str[i]>='0'&&str[i]<='9')
                b=1;
            else
                c=1;
            
            if(i<len-2)
            {
                char str1[4]={0};
                char *str2=NULL;
                str1[0]=str[i];
                str1[1]=str[i+1];
                str1[2]=str[i+2];
                str2=strstr(str+i+3,str1);
                if(str2!=NULL)
                {
                    printf("NG\n");
                    flag=0;
                    break;
                }
            }
        }
        if(A+a+b+c>=3 && flag)
            printf("OK\n");
        else if(A+a+b+c<3 && flag)
            printf("NG\n");
    }
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 332KB, 提交时间: 2022-02-09

#include <stdio.h>

int is_upper(char ch) {
    if (ch >= 'A' && ch <= 'Z') {
        return 1;
    }
    return 0;
}

int is_lower(char ch) {
    if (ch >= 'a' && ch <= 'z') {
        return 1;
    }
    return 0;
}

int is_number(char ch) {
    if (ch >= '0' && ch <= '9') {
        return 1;
    }
    return 0;
}

int is_repeat(char *str) {
    int i,j;
    
    for (i = 0; i < strlen(str) - 1; i++) {
        for (j = i+3; j < strlen(str);  j+=3) {
            if (str[i] == str[j] && str[i+1] == str[j+1] && str[i+2] == str[j+2]) {
                //printf("%d %d\n",i,j);
                return 1;
            }
        }
    }
    return 0;
}

int main(void) {
    char str[101];
    while (scanf("%s",str)!=EOF) {
        int len = strlen(str);
        int vis[4] = {0,0,0,0};
        if (len <= 8) {
            printf("NG\n");
        } else {
            int i;
            if (is_repeat(str)) {
                printf("NG\n");
                continue;
            }
            
            for (i = 0; i < len; i++) {
                if (is_upper(str[i])) {
                    vis[0] = 1;
                } else if (is_lower(str[i])) {
                    vis[1] = 1;
                } else if (is_number(str[i])) {
                    vis[2] = 1;
                } else {
                    vis[3] = 1;
                }
            }
            
            if (vis[0] + vis[1] + vis[2] + vis[3] >= 3) {
                printf("OK\n");
            } else {
                printf("NG\n");
            }
        }
        memset(str,0,sizeof(str));
    }
    return 0;
}

上一题