GESP认证C++编程真题解析 | 202306 三级
附上汇总帖GESP认证C编程真题解析 | 汇总编程题B3842 春游【题目来源】洛谷[B3842 GESP202306 三级] 春游 - 洛谷【题目描述】老师带领同学们春游。已知班上有N NN位同学每位同学有从0 00到N − 1 N-1N−1的唯一编号。到了集合时间老师确认是否所有同学都到达了集合地点就让同学们报出自己的编号。到达的同学都会报出自己的编号不会报出别人的编号但有的同学很顽皮会多次报出。你能帮老师找出有哪些同学没有到达吗 ?。【输入】输入包含2 22行。第一行包含两个整数N NN和M MM表示班级有N NN位同学同学们共有M MM次报出编号。约定2 ≤ N , M ≤ 1000 2 \le N,M \le 10002≤N,M≤1000。第二行包含M MM个整数分别为M MM次报出的编号。约定所有编号是小于N NN的非负整数。【输出】输出一行。如果所有同学都到达则输出N NN否则由小到大输出所有未到达的同学编号空格分隔。【输入样例】3 3 0 2 1【输出样例】3【算法标签】《洛谷 B3842 春游》 #数组# #GESP# #2023#【代码详解】#includebits/stdc.husingnamespacestd;constintN1005;// 最大范围intn,m;// n: 范围[0,n-1] m: 已标记的数字个数inta[N];// 标记数组a[i]1表示数字i被标记a[i]0表示未标记boolflag0;// 标记是否有未标记的数字intmain(){// 输入范围n和已标记数字数量mcinnm;// 读入m个已标记的数字while(m--){intx;// 当前标记的数字cinx;a[x]1;// 标记这个数字}// 遍历范围[0, n-1]输出未标记的数字for(inti0;in-1;i){if(a[i]0)// 如果数字i未标记{couti ;// 输出这个数字flag1;// 标记有未标记的数字}}// 如果没有找到任何未标记的数字if(!flag){coutnendl;// 输出n}return0;}【运行结果】3 3 0 2 1 3B3843 密码合规【题目来源】洛谷[B3843 GESP202306 三级] 密码合规 - 洛谷【题目描述】网站注册需要有用户名和密码编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。只能由a ∼ z \texttt a \sim \texttt za∼z之间26 2626个小写字母、A ∼ Z \texttt A \sim \texttt ZA∼Z之间26 2626个大写字母、0 ∼ 9 0 \sim 90∼9之间10 1010个数字以及!#$四个特殊字符构成。密码最短长度: 6 :6:6个字符密码最大长度: 12 :12:12个字符。大写字母小写字母和数字必须至少有其中两种以及至少有四个特殊字符中的一个。【输入】输入一行不含空格的字符串。约定长度不超过100 100100。该字符串被英文逗号分隔为多段作为多组被检测密码。【输出】输出若干行每行输出一组合规的密码。输出顺序以输入先后为序即先输入则先输出。【输入样例】seHJ12!,sjdkffH$123,sdf!12HDHa!,123^YUhg!【输出样例】seHJ12! sjdkffH$123【算法标签】《洛谷 B3843 密码合规》 #字符串入门# #GESP# #2023#【代码详解】#includebits/stdc.husingnamespacestd;string s;// 输入字符串包含多个以逗号分隔的密码/** * 检查单个密码是否符合要求 * 密码要求 * 1. 长度在6到12个字符之间 * 2. 至少包含以下字符类型中的2种 * - 大写字母 * - 小写字母 * - 数字 * 3. 必须包含特殊字符! # $ 之一 * 4. 只能包含允许的字符大小写字母、数字、!#$ * * param t 要检查的密码字符串 * return 如果符合要求返回true否则返回false */boolcheck(string t){// 调试用可查看每次检查的密码// cout t t endl;// 检查1密码长度必须在6到12个字符之间if(t.size()6||t.size()12)returnfalse;// 标志变量用于检查字符类型boolflagAfalse;// 是否包含大写字母boolflagafalse;// 是否包含小写字母boolflag1false;// 是否包含数字boolflag2false;// 是否包含特殊字符!#$// 第一次遍历检查字符类型for(inti0;it.size();i){if(isupper(t[i]))// 检查是否为大写字母flagA1;elseif(islower(t[i]))// 检查是否为小写字母flaga1;elseif(isdigit(t[i]))// 检查是否为数字flag11;// 检查是否为特殊字符if(t[i]!||t[i]||t[i]#||t[i]$)flag21;}// 检查2至少包含大写字母、小写字母、数字中的2种if(flagAflagaflag12)returnfalse;// 检查3必须包含特殊字符!#$之一if(!flag2)returnfalse;// 第二次遍历检查是否只包含允许的字符for(inti0;it.size();i){// 只允许大小写字母、数字、特殊字符!#$if(!(islower(t[i])||isupper(t[i])||isdigit(t[i])||t[i]!||t[i]||t[i]#||t[i]$))returnfalse;}// 所有检查都通过returntrue;}intmain(){// 输入密码字符串以逗号分隔多个密码cins;intns.size();// 获取输入字符串的长度// 在字符串前添加一个空格方便处理s s;string t;// 临时字符串用于存储一个密码// 遍历输入字符串以逗号为分隔符分割密码for(inti1;in;i){if(s[i]!,){// 如果不是逗号追加到当前密码ts[i];}else{// 遇到逗号检查当前密码if(check(t))couttendl;// 密码有效输出t;// 重置临时字符串准备处理下一个密码}}// 检查最后一个密码末尾没有逗号if(check(t))couttendl;return0;}【运行结果】seHJ12!,sjdkffH$123,sdf!12HDHa!,123^YUhg! seHJ12! sjdkffH$123