用豆包做这道题的题解
2026-09-05 21:58:40
发布于:四川
11阅读
0回复
0点赞
逐行讲解代码
完整代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
string s;
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
bool check1=false,check2=false;
int l=s.size();
for(int j=0;j<l;j++){
if(s[j]>='A' && s[j]<='Z'){
check1=true;
}
if(s[j]>='0' && s[j]<='9'){
check2=true;
}
}
if(check1 && check2 && l>=8){
cout<<'Y'<<"\n";
}else{
cout<<'N'<<"\n";
}
}
return 0;
}
逐步开始讲解
#include<bits/stdc++.h>
using namespace std;
#include<bits/stdc++.h>:万能头文件,把做题要用的所有库全部包含进来,string、cin、cout都不用额外写头文件,GESP 考试经常用。using namespace std;:让我们直接写cin、cout,不用写std::cin、std::cout。
int main(){
int n;
string s;
cin>>n;
int n;:n就是题目里的 T,代表有多少个密码。string s;:字符串变量s,用来存每一个密码。cin>>n;:读取密码的组数。
for(int i=1;i<=n;i++){
cin>>s;
for(int i=1;i<=n;i++):循环执行 n 次,每一轮处理 1 个密码。cin>>s;:读入一个密码字符串。
bool check1=false,check2=false;
int l=s.size();
bool check1=false,check2=false;check1:标记有没有大写字母,一开始默认没有,falsecheck2:标记有没有数字,一开始默认没有,false
int l=s.size();s.size()得到密码的字符数量(密码长度),存到变量l。
for(int j=0;j<l;j++){
if(s[j]>='A' && s[j]<='Z'){
check1=true;
}
if(s[j]>='0' && s[j]<='9'){
check2=true;
}
}
内层循环,逐个遍历密码的每一个字符
s[j]:密码的第 j 个字符s[j]>='A' && s[j]<='Z':判断这个字符是不是大写 A‑Z。如果是,check1 = true,代表找到了大写字母。s[j]>='0' && s[j]<='9':判断是不是数字 0‑9。如果是,check2 = true,代表找到了数字。
只要出现过一次大写,check1 就永远是 true;只要出现一次数字,check2 就永远 true。
if(check1 && check2 && l>=8){
cout<<'Y'<<"\n";
}else{
cout<<'N'<<"\n";
}
题目三个条件必须全部同时满足:
check1等于 true → 有大写字母check2等于 true → 有数字l >=8→ 密码长度大于等于 8
&& 意思是并且,三个条件都成立才执行cout<<'Y',输出安全;
只要任意一个条件不满足,输出N,不安全。
"\n"代表换行。
}
return 0;
}
循环结束,程序正常结束。
对应题目三条规则
- ✅长度≥8:
l>=8 - ✅至少一个大写字母:
check1 - ✅至少一个数字:
check2
三个条件缺一不可。
举例子测试理解
例子 1:密码 Pa2
- 长度
l=3,l>=8不成立 → 输出 N
例子 2:密码ab1da3cd
- 有数字 (check2=true),没有大写(check1=false) → 输出 N
例子 3:密码PAs1s2an
- check1=true,check2=true,l=8 →全部满足,输出 Y
易错点提醒
- 不能写成
||(或者),必须用&&(并且) - 每次处理新密码,
check1和check2一定要重置为false。你的代码写在 for 循环里面,每次都会重置,这点写对了!
如果把
bool check1=false,check2=false;写到 for 循环外面,就会出错,上一个密码的标记会带到下一个密码。你的代码这里是正确的。
这里空空如也








有帮助,赞一个