网上流传一句话:"常在网上飘啊,哪能不挨刀啊~"。其实要想能安安心心地上网其实也不难,学点安全知识就可以。
首先,我们就要设置一个安全的密码。那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件:
(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=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
#include
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=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]++;
}
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
#include
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
#include
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
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;
}