)
目录说明1、计算Sn (北大)2、字符串翻转贵州大学3、求1-n的和北大4、排序兰州大学5、字符移动兰州大学6、反序数清华大学7、加密算法8、整除贵州大学9、删除字符串贵州大学10、判断素数11、进制转换北大12、首字母大写北大13、促销计算兰州大学14、二进制数北邮15、数字统计16、成绩排序清华说明筛选了各学校的难度较低和考点频率较高的机试题目注意高校机考时大多数高校的机考系统不同于Leetcode, 需要自己写输入输出参考ACM模式每道题目备注了题目出处当然可能多个学校考察过。1、计算Sn (北大)思路关键是理解每个项是前一个项×10a。代码2、字符串翻转贵州大学题解法一法二C 标准库函数reverse3、求1-n的和北大法一循环累加法二更优等差数列求和公式4、排序兰州大学用C的STL来做将奇数和偶数分别存在vector中分别进行排序后再输出。(注意需要用到容器的哪个工具要包含对应的头文件比如用到vector,需在头部添加 #include vector)。n是每组测试用例的数字个数。#include iostream #include vector #include algorithm using namespace std; int main(){ int n; while(cin n){ // 多组输入读取每组数字个数 vectorint odds, evens; // 存奇数、偶数 for(int i0; in; i){ int num; cin num; if(num % 2 ! 0){ odds.push_back(num); }else{ evens.push_back(num); } } // 分别升序排序 sort(odds.begin(), odds.end()); sort(evens.begin(), evens.end()); // 输出奇数无行首空格 for(int i0; iodds.size(); i){ if(i0) cout ; cout odds[i]; } // 输出偶数衔接奇数控制空格 for(int i0; ievens.size(); i){ if(i0 !odds.empty()){ // 有奇数时偶数第一个元素前加空格 cout ; } if(i0) cout ; // 偶数内部后续元素加空格 cout evens[i]; } // 这个大括号是偶数循环的结束 cout endl; // 每组输出后换行必须在while循环内 } // 这个大括号是while循环的结束 return 0; }5、字符移动兰州大学和前一道题类似使用STL将数字和字符单独存在string中这里判断是不是数字使用cctype的isdigit()函数。#include iostream #include string #include cctype using namespace std; int main(){ string s,result; string digit,non_digit; getline(cin,s); for(char c:s){ if(isdigit(c)){ digitc; } else{ non_digitc; } } result non_digitdigit; coutresultendl; return 0; }如果像前一道题那样需要排序加下面两排代码就行。// 分别排序 sort(non_digit.begin(), non_digit.end()); // 非数字按ASCII升序 sort(digit.begin(), digit.end()); // 数字按字符/数值升序等价6、反序数清华大学思路循环遍历所有的四位数将int型的数反转转为string后在转回int,得到其反序数再判断是否是9倍关系。7、加密算法解题关键是如何获取其后的第三个字母这里需要熟练记住当成一个模版直接用。c (c - A 3) % 26 A;#include iostream #include string using namespace std; int main() { string s; getline(cin, s); // 读取整行输入包含空格 // 遍历每个字符表示直接修改原字符串无需额外拼接 for (char c : s) { if (c A c Z) { // 大写字母位移3位超出Z则循环 c (c - A 3) % 26 A; } else if (c a c z) { // 小写字母位移3位超出z则循环 c (c - a 3) % 26 a; } // 其他字符数字、空格等不做处理 } cout s endl; // 输出加密后的字符串 return 0; }8、整除贵州大学注意这里要求每一行结尾没有空格输出技巧是在每个数字输出之前输出空格并特殊处理第一个数字。#include iostream using namespace std; int main() { int count 0; // 计数器记录已输出的数的个数 for (int i 100; i 1000; i) { // 注意题目是100到1000之间包含1000 if (i % 30 0) { // 能被5和6同时整除等价于能被30整除 count; // 控制格式不是第一个数时先输出空格 if (count 1) cout ; cout i; // 每10个数换行 if (count % 10 0) { cout endl; } } } // 如果最后一行不足10个数手动补换行 if (count % 10 ! 0) { cout endl; } return 0; }9、删除字符串贵州大学本道题利用栈将字符串的字符依次压入栈中并获取栈顶三个元素判读是否是需要删除的字符串是则弹出。代码#include iostream #include string #include cctype using namespace std; int main(){ string s; getline(cin,s); string str; for(char c:s){ str.push_back(c); //取出栈顶三个元素并转换为小写 if(str.size() 3){ char a tolower(str[str.size()-3]); char b tolower(str[str.size()-2]); char c_char tolower(str[str.size()-1]); if(a g bz c_charu){ str.pop_back(); str.pop_back(); str.pop_back(); } } } coutstrendl; return 0; }10、判断素数11、进制转换北大这里使用 stoull() —— STL 的核心转换函数避免自己手动实现进制转换。stoull 是 C11 开始提供的 STL 标准函数全称是 string to unsigned long long专门用来把字符串转换成无符号长整型数。它有 3 个参数格式是stoull(要转换的字符串, 指针参数, 进制数);#include iostream #include string using namespace std; int main(){ string str; // 存储输入的十六进制字符串 while(cinstr){ // 循环读取多组输入 int start 0; // 有效数字起始位置默认从0开始 // 跳过0x/0X前缀 if(str.size()2 (str.substr(0,2)0X || str.substr(0,2)0x)){ start 2; } string str_part str.substr(start); // 截取有效数字部分 // 十六进制字符串转十进制无符号长整型 unsigned long long part stoull(str_part,nullptr,16); string result to_string(part); // 数字转字符串 coutresultendl; // 输出结果 } return 0; }12、首字母大写北大注意输出要求是每个单词首字母大写而不是句子首字母大写。#include iostream #include string #include cctype // 包含isspace(判断空白符)、toupper(转大写)函数 using namespace std; int main(){ string s; // 存储输入的字符串 while(getline(cin,s)){ // 循环读取整行输入保留空格 bool capitalize true; // 标记下一个字符是否需要转大写初始为true首字符大写 // 遍历字符串每个字符 for(int i0;is.size();i){ // 遇到空白符标记下一个字符需要大写新单词开头 if(isspace(s[i])){ capitalize true; } else{ // 非空白符且需要大写时转换为大写并重置标记 if(capitalize){ s[i] toupper(s[i]); // 字符转大写 capitalize false; // 重置标记避免同一单词后续字符大写 } } } cout s endl; // 输出处理后的字符串 } return 0; }13、促销计算兰州大学这是最开始学C写的代码真的不堪入目。虽然结果正确但代码不够优美简洁。#include iostream using namespace std; int main(){ float n; float discount1; float pay; while(cinn){ if(n1000){ coutdiscountdiscount,paynendl; } else if(n2000){ discount0.95; payn*discount; coutdiscountdiscount,paypayendl; } else if(n3000){ discount0.9; payn*discount; coutdiscountdiscount,paypayendl; } else if(n5000){ discount0.85; payn*discount; coutdiscountdiscount,paypayendl; } else{ discount0.8; payn*discount; coutdiscountdiscount,paypayendl; } } }这是上面的代码存在的三个问题1、discount 初始化为 1但在 n1000 分支里直接输出原值其他分支才重新赋值。问题虽然结果正确但逻辑上每次循环都应该重新确定折扣而不是依赖上一次循环的残留值可读性和可维护性较差。2、每个 if/else if/else 分支里都重复写了 cout 语句只是 discount 和 pay 的值不同。问题代码冗余不利于维护如果要改输出格式需要改多处。建议把 pay n * discount 和 cout 统一放到所有条件判断之后只写一次。3、用 float 存储金额精度足够但在 C 中更推荐用 double 以获得更高精度避免浮点数误差。#include iostream using namespace std; int main() { double n; // 用 double 提高精度 double discount; double pay; while (cin n) { // 统一在循环内确定折扣 if (n 1000) { discount 1.0; } else if (n 2000) { discount 0.95; } else if (n 3000) { discount 0.9; } else if (n 5000) { discount 0.85; } else { discount 0.8; } pay n * discount; // 只写一次输出避免冗余 cout discount discount ,pay pay endl; } return 0; // 符合 C 标准显式返回 }14、二进制数北邮针对输入的非负整数先特殊处理 n0 直接输出 0对 n0 的情况通过循环除 2 取余获取二进制低位到高位的字符序列再利用标准库 reverse 函数反转序列得到正确的二进制字符串并输出。#include iostream #include string #include algorithm using namespace std; int main(){ unsigned int n; while(cinn){ if(n0){ cout0/n; } string str; while(n0){ str (n%2)?1:0; n/2; } reverse(str.begin(),str.end()); coutstrendl; } return 0; }15、数字统计当时我的做法是将区间内每个数字转为字符串逐字符遍历统计其中字符 2 的出现次数最终累加得到总次数。我第一次自己写出来时特别开心。#include iostream #include string #include algorithm using namespace std; int main(){ int start,end; cinstartend; int count20; for(int istart;iend;i){ string str to_string(i); for(char cha:str){ if(cha2){ count2; } } } coutcount2; return 0; }16、成绩排序清华解题思路定义结构体存储学生姓名、成绩和录入顺序录入顺序用于保证同分情况下排序的稳定性读取多组输入的学生数量和排序类型循环录入每个学生的姓名、成绩并记录录入顺序根据排序类型降序 / 升序用sort结合 lambda 表达式定义排序规则成绩不同按成绩升 / 降序排成绩相同按录入顺序升序排遍历输出排序后的学生姓名和成绩。#include iostream #include vector #include algorithm #include string using namespace std; // 定义学生结构体存储姓名、成绩、录入顺序保证同分排序稳定性 struct Student{ string name; // 学生姓名 int score; // 学生成绩 int order; // 录入顺序用于同分情况下先录入的学生排在前面 }; int main(){ int n, type; // n学生数量type排序方式0降序1升序 // 循环读取多组测试数据直到输入结束如CtrlZ或文件结束 while(cin n type){ // 创建大小为n的vector存储n个Student对象 vectorStudent students(n); // 遍历录入n个学生的信息in-1 等价于 in均为0~n-1的合法下标 for(int i0; in-1; i){ cin students[i].name students[i].score; // 录入姓名和成绩 students[i].order i; // 记录当前学生的录入顺序从0开始 } // 排序方式0按成绩降序高→低同分则按录入顺序升序先录→前 if(type 0){ // sort的第三个参数是lambda表达式临时比较函数定义排序规则 sort(students.begin(), students.end(), [](const Student a, const Student b){ // const Student只读引用避免复制、保证数据安全 if(a.score ! b.score){ // 成绩不同时按成绩降序 return a.score b.score; // 返回true表示a排在b前面 }else{ // 成绩相同时按录入顺序升序先录入的order更小 return a.order b.order; } }); } // 排序方式1按成绩升序低→高同分则按录入顺序升序先录→前 if(type 1){ sort(students.begin(), students.end(), [](const Student a, const Student b){ if(a.score ! b.score){ // 成绩不同时按成绩升序 return a.score b.score; }else{ // 成绩相同时按录入顺序升序 return a.order b.order; } }); } // 遍历输出排序后的所有学生信息姓名空格成绩换行 for(const auto s : students){ cout s.name s.score endl; } } return 0; }