1. C++机试题目解析与实现
1.1 题目101:找出最长质数子串
1.1.1 问题分析
这道题目要求我们从输入的数字串中找出最长的不超过4个字符的质数子串。如果有多个相同长度的质数子串,则选择数值最大的那个。质数是指大于1的自然数,除了1和它本身外没有其他约数。
关键点:
- 子串长度限制在1-4个字符
- 需要判断每个子串对应的数字是否为质数
- 需要记录满足条件的最大质数
1.1.2 算法设计
采用双重循环遍历所有可能的子串:
- 外层循环遍历子串起始位置
- 内层循环控制子串长度(1-4)
- 对每个子串转换为数字后判断是否为质数
- 更新最大质数记录
质数判断优化:
- 只需检查2到√n之间的整数是否能整除n
- 提前排除小于2的数字
1.1.3 代码实现
cpp复制#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
int findMaxPrimeSubstring(string s) {
int maxPrime = 0;
int len = s.length();
for (int i = 0; i < len; i++) {
for (int j = 1; j <= 4 && i + j <= len; j++) {
string sub = s.substr(i, j);
int num = stoi(sub);
if (isPrime(num) && num > maxPrime) {
maxPrime = num;
}
}
}
return maxPrime;
}
int main() {
string s;
while (cin >> s) {
cout << findMaxPrimeSubstring(s) << endl;
}
return 0;
}
1.1.4 注意事项
- 子串长度不能超过4,同时不能超出字符串边界
- 使用stoi函数将字符串转换为整数时要注意异常处理
- 质数判断函数需要优化,避免不必要的计算
- 题目保证至少存在一个解,所以不需要处理无解情况
1.2 题目102:翻译字符串
1.2.1 问题分析
这道题目要求我们按照特定规则翻译字符串:
- 遇到数字n(0-9),将后一个字符重复n+1次
- 后一个字符不需要再次翻译
- 非数字字符直接输出
- 翻译后的字符串每3个字符一组,用空格分隔
1.2.2 算法设计
- 遍历输入字符串
- 遇到数字时,处理数字和后一个字符
- 跳过已经处理的后一个字符
- 非数字字符直接添加到结果
- 最后将结果字符串按3个字符一组输出
1.2.3 代码实现
cpp复制#include <bits/stdc++.h>
using namespace std;
string translateString(string s) {
string result;
int i = 0;
int len = s.length();
while (i < len) {
if (s[i] == '@') {
result += '@';
i++;
} else if (isdigit(s[i])) {
int repeat = s[i] - '0' + 1;
if (i + 1 < len) {
char nextChar = s[i + 1];
for (int j = 0; j < repeat; j++) {
result += nextChar;
}
i += 2; // 跳过下一个字符
} else {
// 数字是最后一个字符(除了@),直接添加
result += s[i];
i++;
}
} else {
result += s[i];
i++;
}
}
return result;
}
void printFormatted(string s) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
cout << s[i];
count++;
if (count % 3 == 0 && i != s.length() - 1) {
cout << " ";
}
}
}
int main() {
string s;
bool firstCase = true;
while (getline(cin, s)) {
if (!firstCase) {
cout << endl;
}
firstCase = false;
string translated = translateString(s);
printFormatted(translated);
}
return 0;
}
1.2.4 注意事项
- 注意处理数字是最后一个字符的情况(题目保证以@结尾,所以不会出现)
- 输出格式要求严格,每3个字符一组,用空格分隔
- 多组测试数据之间不能有空行,但每组结果要单独一行
- 数字后的字符不需要再次翻译,所以要跳过
1.3 题目103:分割数字并排序
1.3.1 问题分析
这道题目要求:
- 将输入字符串中的所有'5'替换为空格
- 将分割得到的数字字符串转换为整数
- 忽略前导零(除非数字本身就是0)
- 对得到的整数进行排序输出
1.3.2 算法设计
- 遍历输入字符串,将'5'替换为空格
- 使用stringstream读取分割后的数字
- 将数字存入vector
- 对vector进行排序
- 按要求格式输出
1.3.3 代码实现
cpp复制#include <bits/stdc++.h>
using namespace std;
vector<long long> splitAndConvert(string s) {
string temp;
for (char c : s) {
if (c == '5') {
temp += ' ';
} else {
temp += c;
}
}
vector<long long> numbers;
stringstream ss(temp);
string token;
while (ss >> token) {
// 去除前导零
int i = 0;
while (i < token.length() - 1 && token[i] == '0') {
i++;
}
string numStr = token.substr(i);
long long num = stoll(numStr);
numbers.push_back(num);
}
return numbers;
}
int main() {
int t;
cin >> t;
cin.ignore(); // 忽略第一行后的换行符
while (t--) {
string s;
getline(cin, s);
vector<long long> numbers = splitAndConvert(s);
sort(numbers.begin(), numbers.end());
for (int i = 0; i < numbers.size(); i++) {
if (i > 0) cout << " ";
cout << numbers[i];
}
cout << endl;
}
return 0;
}
1.3.4 注意事项
- 前导零处理要小心,如"005"应该转换为5,"000"应该转换为0
- 使用stoll而不是stoi,以防大数情况
- 多组测试数据的第一行是测试用例数量,需要先读取
- 输出格式要求严格,数字间用单个空格分隔,最后无空格
1.4 华为OD机试常见问题与技巧
1.4.1 输入输出处理技巧
- 多组测试数据通常用while(cin >> ...)或while(getline(cin, ...))处理
- 注意输入中的空格和换行符处理
- 输出格式要严格符合要求,包括空格和换行
1.4.2 常见错误
- 数组越界:特别是在处理子串或字符时
- 边界条件:如空输入、极值等
- 类型溢出:使用足够大的数据类型
- 前导零处理不当
1.4.3 优化建议
- 提前编写常用函数(如质数判断)
- 使用标准库函数简化代码(sort, stoi等)
- 添加必要注释,方便调试
- 先写伪代码,再实现具体函数
1.4.4 调试技巧
- 使用小样例手动验证
- 添加调试输出(完成后删除)
- 分模块测试各个函数
- 注意编译器警告信息
2. 计算机类型概述
2.1 台式计算机
台式计算机是最传统的个人计算机形式,主要特点包括:
- 需要固定位置放置,依赖外部电源
- 通常由多个独立组件组成(主机、显示器、键盘等)
- 性能通常优于便携设备
- 价格相对较低,入门级约500美元
常见使用场景:
- 办公室环境
- 家庭固定工作站
- 学校计算机实验室
2.2 便携式计算机
便携式计算机(笔记本电脑)特点:
- 集成设计,便于携带
- 内置电池,可移动使用
- 性能与便携性的平衡
- 价格通常高于同等配置的台式机
2.3 移动设备
移动设备(智能手机、平板)特点:
- 高度便携
- 触控交互为主
- 专用操作系统(iOS, Android)
- 应用生态与PC不同
2.4 选择建议
- 需要高性能和扩展性:选择台式机
- 需要移动办公:选择笔记本电脑
- 日常轻量使用:考虑平板电脑
- 预算有限:入门级台式机最具性价比
在实际编程工作中,台式机仍然是许多开发者的首选,因为它提供更好的性能和扩展性,适合运行开发环境和长时间工作。