您的位置:首页 > 其它

密码验证合格程序

2017-07-13 21:20 204 查看


题目描述

密码要求: 

 

1.长度超过8位

 

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

 

3.不能有相同长度超2的子串重复

 

说明:长度超过2的子串

输入描述:

一组或多组长度超过2的子符串。每组占一行

输出描述:

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

示例1

输入

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000


输出

OK
NG
NG
OK


解题思路

对于第一个要求,只要判断输入的字符串长度即可。需要注意的是,其他字符可能包括空格,因此要用getline来输入。

对于第二个要求,只要设置四个int型变量,分别表示四种类型的字符是否存在即可。四个变量的初始化都是0,如果密码字符串中含有某一种变量,则该变量设为1。最后检查四个变量之和是否超过3即可。

对于第三个要求,只需要检查是否有长度为3的重复子串。因为如果有长度超过3的重复子串,其中必定含有长度为3的重复子串。要检查是否有长度为3的重复子串,用两层循环遍历即可。

代码

#include <iostream>
#include <string>
using namespace std;

int main()
{
string code;

while (getline(cin, code))
{
if (code.size() <= 8) //长度必须超过8位
{
cout << "NG" << endl;
continue;
}

int upper = 0, lower = 0, number = 0, other = 0;
//大写,小写字母,数字,其他字符
for (int i = 0; i < code.size(); i++)
{
if (isupper(code[i])) //大小字母
upper = 1;
else if (islower(code[i])) //小写字母
lower = 1;
else if (isdigit(code[i])) //数字
number = 1;
else
other = 1;
}

if (upper + lower + number + other < 3) //至少包含三种
{
cout << "NG" << endl;
continue;
}

bool duplicate = 0; //是否有重复子串
for (int i = 0; i < code.size(); i++) //检查是否有长度为3的子串重复
{
for (int j = i + 3; j < code.size(); j++)
{
if (code[i] == code[j] && code[i + 1] == code[j + 1]
&& code[i + 2] == code[j + 2]) //有重复的子串
{
duplicate = 1;
break;
}
}
}

if (duplicate) //不能有长度超2的重复子串
{
cout << "NG" << endl;
continue;
}

cout << "OK" << endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: