目录
说明:
筛选了各学校的难度较低和考点频率较高的机试题目,注意高校机考时,大多数高校的机考系统不同于Leetcode, 需要自己写输入输出(参考ACM模式),每道题目备注了题目出处,当然可能多个学校考察过。
1、计算Sn (北大)

思路:
关键是理解每个项是前一个项×10+a。

代码:

2、字符串翻转(贵州大学)

题解:
法一:

法二:
C++ 标准库函数 reverse

3、求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){ // 多组输入:读取每组数字个数
vector<int> odds, evens; // 存奇数、偶数
for(int i=0; i<n; 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 i=0; i<odds.size(); i++){
if(i>0) cout << " ";
cout << odds[i];
}
// 输出偶数:衔接奇数,控制空格
for(int i=0; i<evens.size(); i++){
if(i==0 && !odds.empty()){ // 有奇数时,偶数第一个元素前加空格
cout << " ";
}
if(i>0) 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)){
digit+=c;
}
else{
non_digit+=c;
}
}
result = non_digit+digit;
cout<<result<<endl;
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;
}