题目:
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度大于2的子串重复
输入描述:
一组或多组长度超过2的字符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
复制输出:
OK NG NG OK
结果:
解题思路:
1,通过判断ASCII码,判断出数字、大写和小写,不属于这三类的就是符号。
2,当满足其中三个命中的时候就符合,命中个数小于3则返回NG,后面操作都不进行。
3,通过双从循环判断是否有重复的,只需要判断三个字符就可以。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int myCmp(char *str, char *temp, int start, int len) {
for(; start < len - 2; start++) {
if(str[start] == temp[0] && str[start+1] == temp[1] && str[start+2] == temp[2])
return 1;
}
return 0;
}
int main() {
char str[32] = {};
while(scanf("%s", str) != EOF) {
int isCap = 0;
int isLow = 0;
int isNum = 0;
int isSymbol = 0;
int count = 0;
//判断数据类型
int len = strlen(str);
if(len <= 8) {
printf("NG\n");
continue;
}
for(int i = 0; i < len; i++) {
char temp = str[i];
if(temp >= '0' && temp <= '9') isNum = 1;
else if(temp >= 'A' && temp <= 'Z') isCap = 1;
else if(temp >= 'a' && temp <= 'z') isLow = 1;
else if(temp >= 33 && temp <= 126) isSymbol = 1;
count = isCap + isLow + isNum + isSymbol;
if(count >= 3) break;
}
if(count < 3) {
printf("NG\n");
continue;
}
int ret = 0;
for(int i = 0; i < len - 2; i++) {
for(int j = i+3; j < len; j++) {
if(str[i] == str[j] &&
str[i+1] == str[j+1] &&
str[i+2] == str[j+2]) {
ret = 1;
break;
}
}
if(ret) break;
}
if(ret) {
printf("NG\n");
} else {
printf("OK\n");
}
}
return 0;
}