1. 项目概述:DHUOJ基础题目解析
最近在整理东华大学在线判题系统(DHUOJ)的基础题库时,发现58、59、60这三道题目特别适合用来训练编程思维。作为OJ系统里经典的入门级题目,它们涵盖了条件判断、循环控制和基础算法等核心知识点。这三题看似简单,但实际编码时会遇到不少细节问题,特别适合刚接触编程竞赛的同学练手。
我在担任ACM校队教练期间,经常用这类题目训练新生的代码实现能力。很多同学第一次提交时都会遇到各种边界条件错误,经过几次调试后才能完全通过。下面我就结合具体题目,分享一些解题思路和常见错误排查方法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目分析与解题思路
2.1 题目58:数字反转
这道题要求将一个不超过100位的正整数进行反转输出。例如输入12345,输出应为54321。看似简单的需求,实际处理时需要注意几个关键点:
- 输入可能包含前导零(如00234),但输出时应该去掉(应输出432)
- 需要考虑输入为0的特殊情况
- 大数处理(超过long long范围)需要字符串操作
我推荐使用字符串处理的方式,避免数值溢出问题。具体步骤:
cpp复制string num;
cin >> num;
reverse(num.begin(), num.end());
// 去除前导零
while(num.size()>1 && num[0]=='0') num.erase(0,1);
cout << num;
2.2 题目59:素数判断
这道题要求判断给定的n(1≤n≤10^6)是否为素数。常规的暴力解法是从2到n-1逐个试除,但这样时间复杂度是O(n),对于大数会超时。
更优的解法有两种:
- 试除法优化:只需检查2到√n的范围
- 埃拉托斯特尼筛法(适合多次查询)
这里给出优化后的试除法实现:
cpp复制bool isPrime(int n) {
if(n <= 1) return false;
for(int i=2; i*i<=n; i++)
if(n%i == 0) return false;
return true;
}
2.3 题目60:最大公约数
求两个正整数的最大公约数,经典的欧几里得算法题。递归实现非常简洁:
cpp复制int g
