#include <stdio.h> #include<string.h> #include<malloc.h> /* 密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行) */ int Judge(char* str) { int len = strlen(str); //字符串长度 int rec[4] = {0}; //标记数组,用 0 1 记录每一种类型字符出现与否的情况!!!!(太实用了) int cnt = 0; //记录字符串包含多少种字符(大小写字母,数字,其他符号等)为满足第二种情况 int num = 0; //第三种 有相同长度超 2 的子串重复的字符串 //判断字符和数字 for (int i = 0; i < len; i++) { if ((str[i] >= 'A') && (str[i] <= 'Z')) rec[0] = 1; //是大写字母 else if ((str[i] >= 'a') && (str[i] <= 'z')) rec[1] = 1; //小写字母 else if ((str[i] >= '0') && (str[i] <= '9')) rec[2] = 1; //数字 else rec[3] = 1; //其他字符 } //计算字符串包含的字符种类总数 cnt = rec[0] + rec[1] + rec[2] + rec[3]; //一共四种,至少要三种 //判断字符串是否包含长度超 2 的两个以上相同子串,故考虑长度为 3 的子字符串是否有重复即可, //从而子字符串有(len - 2)种可能,但作为基准子字符串的只需要(len - 3)个即可 for (int i = 0; i <= len - 6; i++) { //因为最后一个子字符串被反复判断的次数最多,并且在它之后没有可以比较的子字符串了,所以 i <= len - 6,即最后一个基准子字符串是倒数第二个子字符串 for (int j = i + 3; j <= len - 3; j ++) { if ((str[i] == str[j]) && (str[i + 1] == str[j + 1]) && (str[i + 2] == str[j + 2])) { num++; } if (num != 0) { break; } } if (num != 0) { break; } } //验证密码 if ((len >= 9) && (cnt >= 3) && (num == 0)) { return 1; } else if (len <= 8 || (cnt <= 2) || (num >= 1)) { return 0; } return 0; } int main() { char* str = (char*)malloc(100 * sizeof(char)); while (scanf("%s", str) != EOF) { if (Judge(str) == 1) printf("OK\n"); if (Judge(str) == 0) printf("NG\n"); } return 0; free(str); }