题目:计算密码强度
问题描述
每个人都有很多密码,你知道你的密码强度吗?假定密码由大写字母、小写字母、数字和非字母数字的符号这四类字符构成,密码强度计算规则如下:
- 基础分:空密码(密码长度为零)0分,非空密码1分
- 加分项1:密码长度超过8位,+1分
- 加分项2:密码包含两类不同字符+1分,包含三类不同字符+2分,包含四类不同字符+3分
按照此规则计算的密码强度为0~5。请你设计一个程序计算给出的密码的强度。
输入说明
输入为一个密码字符串,字符串长度不超过50个字符。
输出说明
输出一个整数表示该密码的强度。
输入样例
输入样例1
abcd输入样例2
ab123
输出样例
样例1输出:
1
样例2输出:
2
此题不难,但是其中有一个计数方法值得学习。
此题唯一的难点在于“加分项2”的处理:如何判断字符类型个数,在相应地加分?在这里,我介绍我发现比较好用的一种计数方法:我称之为
“计数器计数法”——
这里的计数器其实就是一个数组judge[n],各元素初始值均为0。数组的每一个元素代表不同情况下满足的次数,满足一次,相应数组元素加1,这样便可以一次性记录所有情况下出现的个数了。请看代码段:
int judge[4]={0}; //数组judge统计存放不同情况下出现字符的个数
for (i=0; i<=len-1; i++)
{
if (ch[i]>=48 && ch[i]<=57) judge[0]++; //出现数字
else if (ch[i]>=65 && ch[i]<=90) judge[1]++; //出现大写字母
else if (ch[i]>=97 && ch[i]<=122) judge[2]++; //出现小写字母
else judge[3]++; //出现其他类型的字符
}
计数器法在处理数字统计的时候,功能更加显著。
因为计数器数组下标就可以表示统计的数字。比如,现在给出一大串数字,要统计不同数字出现的个数:2 3 4 2 1 2 3 4 7 8 5 5 2 3 4 1 3 4 6 8 6 0 9 8 6 4 4 3 2 4 3 1 2 3……那我就开辟judge[n]计数器,从第一个数字开始遍历(假设现在浏览的数字是x),那么计数程序就是:
judge[x]++;
这样,judge计数器数组元素下标表示被统计的数字,元素值就是个数。
.
.
.
请看此题完整的代码:
#include<stdio.h>
#include<string.h>
int main(void)
{
char ch[51];
gets(ch);
int len=strlen(ch);
int score=0;
if (len!=0) score++;
else {printf("0"); return 0;}
if (len>8) score++;
else ;
int i;
int judge[4]={0}; //数组judge统计存放不同情况下出现字符的个数
for (i=0; i<=len-1; i++)
{
if (ch[i]>=48 && ch[i]<=57) judge[0]++; //出现数字
else if (ch[i]>=65 && ch[i]<=90) judge[1]++; //出现大写字母
else if (ch[i]>=97 && ch[i]<=122) judge[2]++; //出现小写字母
else judge[3]++; //出现其他类型的字符
}
int num=0;
for (i=0; i<=3; i++) //只要存在两种类型以上的的字符,强度就要再加
{
if (judge[i]!=0) num++;
}
if (num>=2) score+=num-1;
printf("%d",score);
return 0;
}
不足之处,望大家指正!