题目描述
网上流传一句话:"常在网上飘啊,哪能不挨刀啊~"。其实要想能安安心心地上网其实也不难,学点安全知识就可以。
首先,我们就要设置一个安全的密码。那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件:
(1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码。
输入格式
输入数据第一行包含一个数M,接下有M行,每行一个密码(长度最大可能为50),密码仅包括上面的四类字符。
输出格式
对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。
样例输入
3
a1b2c3d4
Linle@ACM
^~^@^@!%
样例输出
NO
YES
NO
思路
用num[4],分别保存四个字符类别,即
for(int i=0;i<len;i++) { if(str[i]>='0' && str[i]<='9') num[0]++; if(str[i]>='a' && str[i]<='z') num[1]++; if(str[i]>='A' && str[i]<='Z') num[2]++; else num[3]++; }
再用sum记录num=0的次数,如果num>=2,表示没有使用三种以上的字符类别,即
for(int i=0;i<4;i++) { if(num[i]==0) sum++; } if(sum>=2) printf("NO\n"); else printf("YES\n");
所以,最终代码为
#include<stdio.h> #include<string.h> int main() { int m; scanf("%d",&m); while(m--) { int num[4]={0}; char str[30]; scanf("%s",str); int len=strlen(str); if(len>=8 && len<=16) { for(int i=0;i<len;i++) { if(str[i]>='0' && str[i]<='9') num[0]++; if(str[i]>='a' && str[i]<='z') num[1]++; if(str[i]>='A' && str[i]<='Z') num[2]++; if(str[i] == '~' || str[i]== '!' || str[i] == '@' || str[i] == '#' || str[i] == '$' || str[i] == '%' || str[i] == '^') num[3]++; } int sum=0; for(int i=0;i<4;i++) { if(num[i]==0) sum++; } if(sum>=2) printf("NO\n"); else printf("YES\n"); } } return 0; }
与之相似的:统计字母
题目描述
给定一段文章,请输出每个字母出现的次数
输入格式
只有一组输入数据,该数据大小<10KB。在文章中除最后一个字符外,只有小写字母、空格和换行符,没有另外的标点、数字和大写字母等。该文章以’#’结尾。
输出格式
输出格式为“C A”,C为’a’..’z’中的字母,A为出现次数,C和A之间空一格
样例输入
here is the input
this is the article#
样例输出
a 1
b 0
c 1
d 0
e 5
f 0
g 0
h 4
i 5
j 0
k 0
l 1
m 0
n 1
o 0
p 1
q 0
r 2
s 3
t 5
u 1
v 0
w 0
x 0
y 0
z 0
代码如下
#include<stdio.h> #include<string.h> int main(){ char a; int b[26]={0},i; while(1) { a=getchar(); if(a=='#') break; b[(int)(a-97)]++; } char str[]="abcdefghijklmnopqrstuvwxyz"; for(i=0;i<26;i++) { printf("%c %d\n",str[i],b[i]); } return 0; }
也可以用*p="abcdefghijklmnopqrstuvwxyz"
这样就可以直接
for(i=0;i<26;i++)
printf("%c %d\n",*p++,b[i]);
即
#include<stdio.h> #include<string.h> int main(){ char a,*p="abcdefghijklmnopqrstuvwxyz"; int b[26]={0},i; while(1) { a=getchar(); if(a=='#') break; b[(int)(a-97)]++; } for(i=0;i<26;i++) { printf("%c %d\n",*p++,b[i]); } return 0; } 根据输出的格式也可以用二元数组 #include<stdio.h> int main() { char k; int a[26][2],i=0,j=0,t; for(i=0;i<26;i++) for(j=0;j<2;j++) { a[i][0]=i+97;//a[i][0]存入的是26个字母 a[i][1]=0;//a[i][1]是26个字母对应出现的次数 } while(scanf("%c",&k) && k!='#')//当输入的字符不是#时循环 { t=k; if(t>=97 && t<123)//这种字符是26个字母时 a[t-97][1]++;//对应的字母个数加一 } for(i=0;i<26;i++) printf("%c %d\n",a[i][0],a[i][1]);//最后输出对应字母及其个数 return 0; }