密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
说明:长度超过2的子串
输入描述:
一组或多组长度超过2的子符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG
输入
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
输出
OK NG NG OK
这道题拿到手后一看思路很简单,只要满足那三个条件即可,但是真正做起来的时候却发现没有那么容易,所以有一些题目容易看起来简单做起来的时候还真是有点问题的!
1.第一个条件比较好做len=strlen(s);即可知道字符串长度,从而看下程度是否满足,如果不满足后面的直接不用算了。
2.第二个也还可以,但是遇到了一个小小的问题,我们要清楚的是只要包含有大写,小写,数字或者其他字符的3种就可以,这个时候我犯了一个错误就是,遇到一个就+1,这样导致可能只有两种字符也满足,所以为了解决这个问题,可以用之前的一个小技巧就是数组,设一个数组temp[4],分别大写,小写,数字,其他分别对应temp[0],temp[1],temp[2],temp[3],如果出现对应的字符只需要对应的数组位置加1即可,最后统计temp非0的个数;另外一个就是只要有对应的upper,lower,num,other就=1;最后加起来大于3即可。
3.最困扰我的是第三个条件,在字符串中查找子字符串,思路有但是c语言毕竟不像其他语言一样有很多的函数供我们使用,最开始是想将每3个字符放在新的一个字符串数组中,在总的字符串中查找新的字符串,但是没行的通;后面参考了一下别人的想法,两个for循环解决问题,及判断每3个字符是否对应相等,这里要注意for循环的结束条件。
-----------------------------------一下附上我的代码,简单易懂哦--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char s[100];
while( gets(s) )
{ int flag=0;
//第一个条件判断不满足直接后面的就不用判断了
int len=strlen(s);
if(len<=8)
{ printf("NG\n");flag=1;continue;}
//第二个条件判断,不满足则退出
int count=0,num=0,low=0,upper=0,other=0;
for(int i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
num=1;
else if(s[i]>='A'&&s[i]<='Z')
low=1;
else if(s[i]>='a'&&s[i]<='z')
upper=1;
else
other=1;
}
count=num+low+upper+other;
if(count<3)
{ printf("NG\n");flag=1;continue;}
//第三个条件判断
for(int i=0;i<=len-3;i++)
for(int k=i+3;k<len;k++)
{
if(s[i]==s[k]&&s[i+1]==s[k+1]&&s[i+2]==s[k+2])
{ printf("NG\n");flag=1;continue;}
}
//如果flag==0表示满足3个条件,所以输出ok
if(flag==0)
printf("OK\n");
}
return 0;
}