HDOJ 2043 密码
来源:互联网 发布:golang exit status 2 编辑:程序博客网 时间:2024/05/02 02:15
刚开始看到这个题目的时候,就直接理解成只要是长度符合要求并且字符符合要求,就是一个安全的密码了,并没有考虑到至少要3种字符的组合。然后就直接敲代码了(先暂且认为题目就是那个意思),在测试的时候,发现居然不符合我的要求(按照我的理解,密码"Linle@ACM"是安全密码,当然,按照题目的意思来理解,该密码也是安全密码),然后就一直找错误,找了半天都没发现错误,最后实在是没办法,就把脑袋当CPU来使吧,这下可好,发现原来是自己的逻辑出了错,就是在倒数第9行,我的意思是检查字符是否是数字和字母及特殊符号,如果不是的话,那么密码就不安全了,否则就是安全的。为什么说逻辑出错了呢?就拿那个测试的数据来说吧,输入的密码第一个字符是"L",那么那个isalnum函数返回的值是1,然后1不会等于0,所以第一个表达式的值为0,再然后就继续判断第二个表达式,显然"L"不是特殊字符,所以该表达式的值为假,所以整个表达的值为假,所以"Linele@ACM"是不安全的密码,显然"L"是符合我们要求的。就算把第一个表达式的判断改为 isalum(S[i]) == 1也是没有用的,那么isalum返回的结果是1,由于是短路运算符,不再往后判断,然后1等于1,最终还是不安全的密码,所以按照我的那个理解来敲代码,这样的算法是错误的,原因就是在判断的时候,还少了一些制约条件。关于按照我的那个理解应该怎么去写代码就不再说了,还是来看看题目真正的意思吧。
题目已经说了,密码只包含那4种合法的字符,所以我们没有必要再去检查字符的正确性。我们要做的就2件事,即检查密码的长度和密码字符种类的个数,长度很好检查,关键就在于计算密码字符种类个数的计算。我的思路是,用4个判断语句来判断字符的种类,如果符合相应的字符,那么计数器就自增一次,但是相同种类的字符出现的次数可能不止一次,所以这个计数器在自增后,就应该关闭它的自增功能,所以我定义该类型为结构体类型,用4个变量来计数,并用构造函数来实现自动初始化,最后只要判断密码字符种类的个数是不是大于等于3即可。
#include <iostream>#include <ctype.h>#include <string.h>#define MAX 50+2using namespace std;struct zi_fu{ int count;//计数器 bool ji_shu;//计数器的开关 zi_fu();//构造函数};zi_fu::zi_fu(){ count = 0; ji_shu = true;}int Is(char s)//判断是否是特殊字符{ string p ="~!@#$%^"; for(int i=0; i<7; i++) if(s == p[i]) return 1; return 0;}int main(void){ int m;//测试数据的个数 cin>>m; while(m--) { char s[MAX]; memset(s,0,sizeof(s));//初始化密码 cin>>s;//输入密码 int len = strlen(s); if( !(8 <= len && len < 16 ))//如果长度不符合要求 { cout<<"NO"<<endl; continue; } zi_fu xiao,da,shu,fu;//存储字母和符号种类的个数 for(int i=0; i<len; i++) { if( islower(s[i]) && xiao.ji_shu )//小写 { xiao.count++; xiao.ji_shu = false; } else if( isupper(s[i]) && da.ji_shu )//大写 { da.count++; da.ji_shu = false; } else if( isdigit(s[i]) && shu.ji_shu )//数字 { shu.count++; shu.ji_shu = false; } else if( Is(s[i]) && fu.ji_shu )//符号 { fu.count++; fu.ji_shu = false; } } if(xiao.count + da.count + shu.count + fu.count >= 3) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0;}
- HDOJ – 2043 密码
- HDOJ 2043 密码
- hdoj 2043 密码
- hdoj.2043 密码 20140726
- HDOJ 2043 密码
- hdoj 2043密码
- HDOJ-2043 密码
- HDOJ 2043 密码
- hdoj 2043 密码
- HDOJ 2043 密码
- C++ hdoj 2043 密码
- HDOJ--2043 密码
- HDOJ 2043 密码
- ACM--HDOJ 2043--密码--字符串
- hdoj 密码
- hdoj密码
- hdoj 密码 2043 (模拟水)
- hdoj-2043-密码(解题报告)
- jarx与webservice很好地作用
- 手游公司日记(7)
- Linux上部署SVN_个人心得
- 实验三 进程与线程
- 2014-4-20
- HDOJ 2043 密码
- 实验四 进程间通信(上)
- 使用R完成均值检验
- Tomcat 生产服务器性能优化
- Algorithms: Treap树
- 实验五 进程间通信(中)
- apache commons Logging与Log4j结合的使用
- Nand Flash基础知识与坏块管理机制的研究
- svn authz策略配置 (转摘)