关闭

【华为oj】密码验证合格程序

562人阅读 评论(3) 收藏 举报
分类:

问题描述:

密码是否合格的要求

1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串
知识点:  字符串,数组  
题目来源:  内部整理  
练习阶段:  中级  
运行时间限制: 无限制 

内存限制: 无限制 


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

输出:  
如果符合要求输出:OK,否则输出NG
每行输出对应一组输入的结果;

样例输入: 021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
                 

样例输出: 

OK

NG
NG

OK 

问题分析:不能有相同长度超2的子串重复指===例如:aaaa就有两个长度超过了2的子串重复了,aaa、aaa重复了,又如:abcabc,同样的道理,也不符合要求,所以,需要你一个一个的递增遍历比较。

代码:

#include<iostream>
#include<string>
typedef unsigned int uint;
using namespace std;

//字符串长度检测
bool changdu(string str)
{
	if (str.size() <= 8)
		return false;
	else return true;
}




bool checkall(string str)//检测字符串包含字符的类型
{
	uint len;
	bool flags = false, flagdd = false, flagxd = false, flagf = false;
	//flags=数字,flagxd=小写字母,flagdd=大写字母, flagf=其他字符
	len = str.size();
	for (uint i = 0; i < len; i++)
	{
		if ('0' <= str[i] && str[i] <= '9')
			flags = true;
		else if ('a' <= str[i] && str[i] <= 'z')
			flagxd = true;
		else if ('A' <= str[i] && str[i] <= 'Z')
			flagdd = true;
		else if ((32 <= str[i] && str[i] <= 47) || (58 <= str[i] && str[i] <= 64) || (91 <= str[i] && str[i] <= 96) || (123 <= str[i] && str[i] <= 126))
			flagf = true;
	}
	if ((flags && flagdd && flagxd && flagf) || (flagdd && flagxd && flagf) || (flags && flagxd && flagf) || (flags && flagdd && flagf) || (flags && flagdd && flagxd))//字符类型大于等于3,返回true
		return true;
	else return false;
}

bool zichuan(string str)//字串重复检测
{
	uint len = str.size();
	for (uint i = 0; i < len-3; i++)
	{
		for (uint j = i + 1; j < len-2; j++)
		{
			if (str[i] == str[j] && str[i+1] == str[j+1] && str[i+2] == str[j+2])
			{
				return false;
			}
		}
	}
	return true;
}

void puanduan(string *str,uint pos)

{
	for (uint i = 0; i < pos; i++)
	{
		bool flag1 = changdu(str[i]);
		bool flag2 = checkall(str[i]);
		bool flag3 = zichuan(str[i]);
		if (flag1&&flag2&&flag3)
			cout << "OK";
		else 
			cout << "NG";

//if (i!=pos-1)
		cout << endl;
	}
}




int main()
{
	uint pos = 0;
	string *str = new string[100];
	getline(cin,str[0]);
	while (str[pos]!="")
	{
		pos++;	
		getline(cin, str[pos]);
	}
	puanduan(str, pos);

	return 0;

}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:106133次
    • 积分:2271
    • 等级:
    • 排名:第16499名
    • 原创:125篇
    • 转载:4篇
    • 译文:0篇
    • 评论:60条
    最新评论