【数组】【字符】计算密码强度

题目:计算密码强度

问题描述
每个人都有很多密码,你知道你的密码强度吗?假定密码由大写字母、小写字母、数字和非字母数字的符号这四类字符构成,密码强度计算规则如下:

  1. 基础分:空密码(密码长度为零)0分,非空密码1分
  2. 加分项1:密码长度超过8位,+1分
  3. 加分项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;
}

不足之处,望大家指正!

上一篇:filebeat7.5指定自定义index名称无效,自动创建index


下一篇:python逻辑题(以下10道选择题有唯一答案,请编写自定义函数judge遍历答案列表并汇报正确答案)