zoukankan      html  css  js  c++  java
  • HDOJ 2043 password

          刚開始看到这个题目的时候,就直接理解成仅仅要是长度符合要求而且字符符合要求,就是一个安全的password了,并没有考虑到至少要3种字符的组合。然后就直接写程序了(先暂且觉得题目就是那个意思),在測试的时候,发现竟然不符合我的要求(依照我的理解,password"Linle@ACM"是安全password,当然,依照题目的意思来理解,该password也是安全password),然后就一直找错误,找了半天都没发现错误,最后实在是没办法,就把脑袋当CPU来使吧,这下可好,发现原来是自己的逻辑出了错,就是在倒数第9行,我的意思是检查字符是否是数字和字母及特殊符号,假设不是的话,那么password就不安全了,否则就是安全的。为什么说逻辑出错了呢?就拿那个測试的数据来说吧,输入的password第一个字符是"L",那么那个isalnum函数返回的值是1,然后1不会等于0,所以第一个表达式的值为0,再然后就继续推断第二个表达式,显然"L"不是特殊字符,所以该表达式的值为假,所以整个表达的值为假,所以"Linele@ACM"是不安全的password,显然"L"是符合我们要求的。就算把第一个表达式的推断改为 isalum(S[i]) == 1也是没实用的,那么isalum返回的结果是1,因为是短路运算符,不再往后推断,然后1等于1,终于还是不安全的password,所以依照我的那个理解来写程序,这种算法是错误的,原因就是在推断的时候,还少了一些制约条件。关于依照我的那个理解应该怎么去写代码就不再说了,还是来看看题目真正的意思吧。
          题目已经说了,password仅仅包括那4种合法的字符,所以我们没有必要再去检查字符的正确性。我们要做的就2件事,即检查password的长度和password字符种类的个数,长度非常好检查,关键就在于计算password字符种类个数的计算。我的思路是,用4个推断语句来推断字符的种类,假设符合对应的字符,那么计数器就自增一次,可是同样种类的字符出现的次数可能不止一次,所以这个计数器在自增后,就应该关闭它的自增功能,所以我定义该类型为结构体类型,用4个变量来计数,并用构造函数来实现自己主动初始化,最后仅仅要推断password字符种类的个数是不是大于等于3就可以。

    #include <iostream>
    #include <ctype.h>
    #include <string.h>
    #define MAX 50+2
    using 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));//初始化password
          cin>>s;//输入password
    
          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;
    }

  • 相关阅读:
    Swap Nodes in Pairs
    Search for a Range——稍微升级版的二分查找
    Set Matrix Zeroes——常数空间内完成
    Ubuntu系统---C++之Eclipse 开始工程项目
    Ubuntu系统---C++之Eclipse编译器 CDT插件安装
    Ubuntu系统---开机总会显示错误报告处理
    Ubuntu系统---C++之Eclipse IDE 编译器安装
    Ubuntu系统---终端下用g++进行c++项目
    Ubuntu系统---进行C++项目开发的工具
    YOLO---Darknet下的 GPU vs CPU 速度
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4247852.html
Copyright © 2011-2022 走看看