描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足1≤n≤100
输入描述:
一组字符串。
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
输出:
OK NG NG OK
#include <stdio.h> #include <string.h> //以下是Senky的代码: int Judge_len(char* str, int len) { //判断长度 int is_length=0; if (len >= 8) is_length = 1; return is_length; } int Judge_num(char s) { //判断数字 int is_number=0; if (s >= '0' && s <= '9') { is_number = 1; } return is_number; } int Judge_gra_low(char s) { //判断小写字母 int is_gra_low=0; if (s >= 'a' && s <= 'z') { is_gra_low = 1; } return is_gra_low; } int Judge_gra_up(char s) { //判断大写字母 int is_gra_up=0; if (s >= 'A' && s <= 'Z') { is_gra_up = 1; } return is_gra_up; } int Judge_repeat(char* str, int len) { //长度大于2的子串重复就一定会有长度为3的子串重复 int no_repeat=1; for (int i = 0; i < len - 3; i++) { for (int j = i+1; j < len - 3; j++) { if (str[i] == str[j] && str[i + 1] == str[j + 1] && str[i + 2] == str[j + 2]) { no_repeat = 0; return no_repeat; } } } return no_repeat; } void start() { char str[101]; while (scanf("%s", str) != EOF) { int len = strlen(str); int is_length=0;//字符串长度合格标志 int is_number = 0; //字符串数字合格标志 int is_gra_low = 0; //字符串小写字母标志 int is_gra_up = 0; //字符串大写字母标志 int char_flag = 0; //有字符的标志 int no_repeat = 1; //字符串没有重复子串的标志 is_length=Judge_len(str, len); //长度是否合格 for (int i = 0; i < len ; i++) { if (Judge_num(str[i])) is_number=1;//有数字 else if(Judge_gra_low(str[i])) is_gra_low=1;//有小写 else if(Judge_gra_up(str[i])) is_gra_up=1;//有大写 else char_flag = 1; //有字符 } no_repeat =Judge_repeat(str, len); //2个以上的重复子串 //调试部分 // printf("长度:%d\n", is_length); // printf("数字:%d\n", is_number); // printf("小写:%d\n", is_gra_low); // printf("大写:%d\n", is_gra_up); // printf("重复:%d\n", no_repeat); if (is_length && (3 <= is_number + is_gra_low + is_gra_up + char_flag) && no_repeat) { printf("OK\n"); }else printf("NG\n"); } } int main() { start(); return 0;//编辑于2022/10/13 }
总结:
①程序看起来代码没必要这么大量,但是为了维护程序的结构性,因此写的比较有逻辑和条理,读起来可以说毫不费劲 ;
② 当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;