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;
}
}