解题思路:
定义四个变量 且初值设置为0:
int numofdaxie; 等于0表示大写没出现,等于1表示出现
int numofxiaoxie;等于0表示小写没出现,等于1表示出现
int shuzi;等于0表示数字没出现,等于1表示出现
int specialword;等于0表示特殊没出现,等于1表示出现
当密码长度小于8或大于16密码不合格;
当密码长度大于等于8并且numofdaxie+numofxiaoxie+shuzi+specialword>=3时,密码合格;
当密码长度大于等于8并且numofdaxie+numofxiaoxie+shuzi+specialword<3时,密码不合格;
若长度符合条件,从第一个字符开始遍历,比如当大写字母首次出现时,把numofdaxie置为1,之后再次出现大写字母,不做 任何操作;其它三种字符处理同理;
if(password[i]>='A'&&password[i]<='Z'&&(*numofdaxie==0)) (*numofdaxie)++;
每次遍历时,判断numofdaxie+numofxiaoxie+shuzi+specialword是否大于等于3,是则输出YES且跳出循环;
若循环正常结束没有跳出,则说明numofdaxie+numofxiaoxie+shuzi+specialword<3,判断一下输出NO即可;
注意事项:
输出带换行符,每判断新的密码上述4个变量初值更新为0;
参考代码:
#include<stdio.h>
#include<string.h>
void function(char *password,int *numofdaxie,int *numofxiaoxie,int *shuzi,int *specialword);
void format(int *numofdaxie,int *numofxiaoxie,int *shuzi,int *specialword);
/*------------------------------------------------------------------------------------------------*/
int main()
{
char password[20];
int n;
int numofdaxie;
int numofxiaoxie;
int shuzi;
int specialword;
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{ gets(password);
format(&numofdaxie,&numofxiaoxie,&shuzi,&specialword);
function(password,&numofdaxie,&numofxiaoxie,&shuzi,&specialword);
}
return 0;
}
/*------------------------------------------------------------------------------------------------*/
void format(int *numofdaxie,int *numofxiaoxie,int *shuzi,int *specialword)
{
(*numofdaxie)=0;
(*numofxiaoxie)=0;
(*shuzi)=0;
(*specialword)=0;
}
/*------------------------------------------------------------------------------------------------*/
void function(char *password,int *numofdaxie,int *numofxiaoxie,int *shuzi,int *specialword)
{
int length=strlen(password);
if(length<8||length>16)
{
printf("NO\n");
return ;
}
for(int i=0;i<length;i++)
{
if(password[i]>='A'&&password[i]<='Z'&&(*numofdaxie==0))
(*numofdaxie)++;
if(password[i]>='a'&&password[i]<='z'&&(*numofxiaoxie==0))
(*numofxiaoxie)++;
if(password[i]>='0'&&password[i]<='9'&&(*shuzi==0))
(*shuzi)++;
if((password[i]=='~'||password[i]=='!'||password[i]=='@'||password[i]=='#'||password[i]=='$'||password[i]=='%'||password[i]=='^')&&(*specialword==0))
(*specialword)++;
if((*numofdaxie)+(*numofxiaoxie)+(*shuzi)+(*specialword)>=3)
{printf("YES\n");break;}
}
if((*numofdaxie)+(*numofxiaoxie)+(*shuzi)+(*specialword)<3)
printf("NO\n");
return;
}别忘点赞哦-.-
0.0分
12 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include <iostream> #include <cctype> #include <cstring> int main() { int M; std::cin>>M; for(int j = 0;j < M;j++){ char a[50]; std::cin>>a; std::string str = a;//存到字符串中,方便求长度 int n = str.length();//获取密码的长度 if(n < 8||n > 16){ std::cout<<"NO"<<std::endl; continue; //密码太短,跳进下一循环 } int b,c,d,e; b = c = d = e = 0; for(int i =0;i < n;i++){ b += ispunct(a[i]); c += isdigit(a[i]); d += islower(a[i]); e += isupper(a[i]); } int f = (b>0) + (c>0) + (d>0) + (e>0);//用逻辑运算计算出现的字符种类 if(f >= 3) std::cout<<"YES"<<std::endl; else std::cout<<"NO"<<std::endl;@刘靖洋 #include<stdio.h> #include<string.h> int main () { char a[100]; int i=0,e=0,b=0,c=0,d=0,m=0; scanf("%d",&m); getchar(); while(m>0) { gets(a); m--; i=0,e=0,b=0,c=0,d=0; for(i=0;i<strlen(a);i++) { if(a[i]>='A'&&a[i]<='Z') { e=1; } if(a[i]>='a'&&a[i]<='z') { b=1; } if(a[i]>='0'&&a[i]<='9') { c=1; } if(a[i]=='~'||a[i]=='!'||a[i]=='@'||a[i]=='#'||a[i]=='$'||a[i]=='%'||a[i]=='^') { d=1; } } if(strlen(a)>=8&&strlen(a)<=16&&(e+b+c+d)>=3) { printf("YES "); } else printf("NO "); } return 0; }