关于“设置一个安全密码”的问题
本帖最后由 cookiedb 于 2011-11-25 09:29:49 编辑 该题是杭电ACM上的C/C++的题目,ID585,题目要求如下:
题目描述
假设一个比较安全的密码至少应该满足下面两个条件:
(1)密码长度大于等于8,且不要超过16。
(2)密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码。
输入描述
每组测试实例包含一个密码(长度最大为50),密码仅包括上面的四类字符。
输出描述
对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。
注意:测试数据只有一个串,不需要用循环实现多次判断。
输入样例
a1b2c3d4
Hzau@ACM
输出样例
NO
YES
我的代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
bool flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
char a[50],x,y;
int i=0;
cin.getline(a,50,'\n');
while(a[i]!=0) i++;
if(i<7 || i>15)
{
cout << "NO" <<endl;
}
else
{
for(int j=0;j<i;j++)
{
y = a[j];
x = y;
if(x>=65 && x<=90)
{
flag1=1;
}
}
for(j=0;j<i;j++)
{
y = a[j];
x = y;
if(x>=97 && x<=122)
{
flag2=1;
}
}
for(j=0;j<i;j++)
{
y = a[j];
x = y;
if(x>=48 && x<=57)
{
flag3=1;
}
}
for(j=0;j<i;j++)
{
y = a[j];
x = y;
if(x==126 || x==33 ||x==64 || (x>=35 && x<=37) || x==94 )
{
flag4=1;
}
}
for(j=0;j<i;j++)
{
y = a[j];
x = y;
if(x < 33 || x==34 || (x>37 && x<48) || (x>57 && x<64) || (x>90 && x<94) || (x == 95) || x==96 || (x>122 && x<126) || x ==127 )
{
flag5=1;
}
}
}
if(flag5=1)
{
cout << "NO" << endl;
}
else
{
if(flag1 +flag2+ flag3 + flag4 >=3)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}
一共十分的题,我打死都是7分,想了半天也不知道哪里不对,求高人指点!
ps:bool型判断那个地方写的是有点繁琐了,但是好歹也是写对了的。
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>
#define INVALID_CHAR 1
#define INVALID_LEN 2
#define NEED_MORE_GRP 3
#define SUCCESS 4
char grps[256] = {0};
char flag[5] = {0};
void initGrps()
{
char c;
// 第一组
for(c = 'A'; c < 'Z'; ++c)
{
grps[c] = 1;
}
// 第二组
for(c = 'a'; c < 'z'; ++c)
{
grps[c] = 2;
}
// 第三组
for(c = '0'; c < '9'; ++c)
{
grps[c] = 3;
}
// 第四组
grps['~'] = 4;
grps['!'] = 4;
grps['@'] = 4;
grps['#'] = 4;
grps['$'] = 4;
grps['%'] = 4;
grps['^'] = 4;
}
int checkStr(const char* str)
{
assert(str);
memset(flag, 0, 5);
const char* tmp = str;
int len = 0;
while(*tmp)
{
flag[grps[*tmp]] = 1;
len++;
tmp++;
}
printf("%s", str);
if(len < 8
[解决办法]
len > 16)
{
printf("长度为%d, 不合法\n", len);
return INVALID_LEN;
}
if(flag[0])
{
printf("不合法:有非法字符\n");
return INVALID_CHAR;
}
if((flag[1] + flag[2] + flag[3] + flag[4]) < 3)
{
printf("不合法:至少需要有三个组中的字符!\n");
return NEED_MORE_GRP;
}
printf("检测通过\n");
return SUCCESS;
}
int main()
{
initGrps();
checkStr("aaaaaaaaa");
checkStr("aA1");
checkStr("aA1aA1aA1");
checkStr("aaaAAA%%");
}
[解决办法]
题目描述
假设一个比较安全的密码至少应该满足下面两个条件:
(1)密码长度大于等于8,且不要超过16。
但是你的代码中是这样的
if(i<7
[解决办法]
i>15)
{
cout << "NO" <<endl;
}
应该是
if(i<7
[解决办法]
i>16) // i > 16才为假
{
cout << "NO" <<endl;
}
[解决办法]
#include <iostream>
using namespace std;
int main()
{
int flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0;
char a[50];
int i=0;
cin.getline(a,50,'\n');
while(a[i]!=0)
i++;
if(i<7
[解决办法]
i>15)
{
cout << "NO" <<endl;
}
else
{
for( int j = 0; j < i ; j ++ )
{
if( a[j] >= 'A' && a[j] <= 'Z' )
{
flag1 = 1;
}
else if( a[j] >= 'a' && a[j] <= 'z' )
{
flag2 = 1;
}
else if( a[j] >= '0' && a[j] <= '9' )
{
flag3 = 1;
}
else if( a[j] == '~'
[解决办法]
a[j] == '@'
[解决办法]
a[j] == '#'
[解决办法]
a[j] == '$'
[解决办法]
a[j] == '%' )
{
flag4 = 1;
}
}
}
if( flag1 + flag2 + flag3 + flag4 >= 3 )
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
return 0;
}