华为机试题20-密码验证合格程序

1题目描述

点我查看原题

密码要求:

1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串

输入描述:

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

输出描述:

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

示例1

输入

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000

输出

OK
NG
NG
OK

2分析

2.1 分析三个条件,必须依次满足,属于递进关系
2.2 长度超过8位:len > 8;包括大小写字母.数字.其它符号,以上四种至少三种:sum = n1 + n2 + n3 + n4;不能有相同长度超2的子串重复:使用具体的案例分析解决办法,然后推广
2.3两个循环的跳出办法

for (i = 0; i < len - 5; i++)
				{
					int flag = 0;
					for (j = i + 3; j < len - 2; j++)
					{	
							flag = 1;
							break;
					}
					if (flag==1)
					{
						break;
					}
				}

3代码

#include<stdio.h>
#include<string.h>

int main(void)
{
	char strCode[100];	
	int i, j, m1;
	int len;

	while (scanf("%s", &strCode) != EOF)
	{
		len = strlen(strCode);
		if (len > 8)
		{ 
			int n1 = 0, n2 = 0, n3 = 0, n4 = 0, sum = 0;

			for (i = 0; i < len; i++)
			{
				if (strCode[i] >= '0' && strCode[i] <= '9')
				{
					if (sum >= 3)
					{
						break;
					}
					else
					{
						n1=1;
					}
				}
				else if (strCode[i] >= 'A' && strCode[i] <= 'Z')
				{
					if (sum >= 3)
					{
						break;
					}
					else
					{
						n2=1;
					}
				}
				else if (strCode[i] >= 'a' && strCode[i] <= 'z')
				{
					if (sum >= 3)
					{
						break;
					}
					else
					{
						n3=1;
					}
				}
				else
				{
					if (sum >= 3)
					{
						break;
					}
					else
					{
						n4=1;
					}
				}
				sum = n1 + n2 + n3 + n4;
			}
			if (sum >= 3)
			{
				for (i = 0; i < len - 5; i++)
				{
					int flag = 0;
					for (j = i + 3; j < len - 2; j++)
					{
						
						if ((strCode[i] == strCode[j]) && (strCode[i + 1] == strCode[j + 1]) && (strCode[i + 2] == strCode[j + 2]))
						{
							printf("NG\n");		
							flag = 1;
							break;
						}
						else
						{
							m1 = i;
						}
					}
					if (flag==1)
					{
						break;
					}
				}
				if (m1 == len - 6)
					printf("OK\n");
			}
			else
			{
				printf("NG\n");
			}
		}
		else
		{
			printf("NG\n");
		}
	}
}
代码优化
#include<stdio.h>
#include<string.h>



int main(void)
{
	char code[1000];
	int len, a , b , c , d , sum ;
	int flag;

	while (gets(code))
	{
		 a = 0, b = 0, c = 0, d = 0, sum = 0;
		 flag = 1;

		len = strlen(code);

		//长度大于8
		if (len <= 8)
		{
			flag = 0;
		}

		//至少三种字符
		if (flag==1)
		{
			for (int i = 0; i < len; i++)
			{
				if (code[i] >= '0'&&code[i] <= '9')
				{
					a = 1;
				}
				else if (code[i] >= 'A'&&code[i] <= 'Z')
				{
					b = 1;
				}
				else if (code[i] >= 'a'&&code[i] <= 'z')
				{
					c = 1;
				}
				else
				{
					d = 1;
				}
				sum = a + b + c + d;
				if (sum >= 3)
				{
					break;
				}
			}
			if (sum < 3)
			{
				flag = 0;
			}
		}


		//不能有两个及以上字符串相同
		if (flag==1)
		{
			for (int i = 0; i < len-5; i++)
			{
				for (int j = i + 2; j < len-2; j++)
				{
					if (code[i] == code[j] && code[i + 1] == code[j + 1] && code[i + 2] == code[j + 2])
					{
						flag = 0;
						if (flag == 0)
						{
							break;
						}
					}
				}
				if (flag == 0)
				{
					break;
				}
			}

		}
	

		if (flag==0)
		{
			printf("NG\n");
		}
		else 
		{
			printf("OK\n");
		}
	
	}
	return 0;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值