这道题目来自牛客周赛Round 127,题目名为"Get The Number"。从给出的代码来看,这是一个典型的数学运算判断问题。题目要求我们根据输入的三个整数a、b、c,判断c是否可以通过a和b的加、减、乘、除运算得到。
核心判断条件非常明确:
在代码实现中,作者使用了简单的条件判断语句来检查这四种情况。如果满足任一条件,输出"YES";否则输出"NO"。
注意:在除法判断时,代码特别检查了a%b==0这个条件,这是为了避免出现非整除的情况。这是一个很重要的细节处理,在实际编程竞赛中经常会被考察到。
让我们深入分析给出的C++代码实现:
cpp复制#include <bits/stdc++.h>
#define endl '\n'
#define int ll
using ll = long long;
typedef unsigned long long ull;
using namespace std;
void GordenGhost();
signed main() {
#ifdef Gorden
freopen("in.txt", "rt", stdin);
freopen("out.txt", "wt", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
GordenGhost();
return 0;
}
void GordenGhost() {
int a,b,c;
cin>>a>>b>>c;
if (c==a+b||c==a-b||c==a*b) cout<<"YES\n";
else if (a%b==0&&c==a/b) cout<<"YES\n";
else cout<<"NO\n";
}
代码采用了典型的竞赛编程风格:
这种结构在编程竞赛中非常常见,因为它可以节省编码时间,同时保持代码的整洁性。
核心逻辑在GordenGhost()函数中:
这个实现简洁高效,时间复杂度是O(1),空间复杂度也是O(1),是最优解。
在实际编程竞赛中,这类题目往往会有一些边界情况需要考虑:
虽然题目没有明确说明数据范围,但在实际比赛中,我们通常需要考虑大数情况。原代码使用了long long类型,这可以处理大多数情况下的整数溢出问题。
提示:在不知道输入范围的情况下,使用long long而不是int是一个好习惯,可以避免很多潜在的溢出问题。
代码中没有显式处理b=0的情况。在C++中,除以零会导致运行时错误。虽然题目可能保证了b≠0,但在实际编程中,我们应该添加对b=0的检查:
cpp复制if (b == 0) {
// 处理除数为零的情况
}
C++中的整数除法是向零取整的,这意味着:
这与数学上的除法略有不同。如果题目有特殊要求,可能需要额外处理。
虽然当前解法已经是最优的,但我们还可以探讨一些其他实现方式:
可以将四种运算结果存储在数组中,然后遍历检查:
cpp复制vector<int> results = {a+b, a-b, a*b};
if (b != 0 && a % b == 0) {
results.push_back(a/b);
}
for (int res : results) {
if (res == c) {
cout << "YES\n";
return;
}
}
cout << "NO\n";
这种写法更易于扩展,如果要增加更多运算类型,只需修改results数组即可。
对于更复杂的运算判断,可以使用函数指针或lambda表达式:
cpp复制auto check = [&](function<int(int,int)> op) {
try {
return op(a,b) == c;
} catch (...) {
return false;
}
};
if (check([](int x, int y) { return x + y; }) ||
check([](int x, int y) { return x - y; }) ||
check([](int x, int y) { return x * y; }) ||
(b != 0 && a % b == 0 && check([](int x, int y) { return x / y; }))) {
cout << "YES\n";
} else {
cout << "NO\n";
}
这种写法虽然复杂,但展示了C++的高级特性,在实际工程中可能更有用。
这类题目虽然简单,但它体现了编程竞赛中的几个重要概念:
在编程竞赛中,必须考虑所有可能的情况。这道题要求我们检查四种运算结果,少考虑任何一种都会导致错误。
即使题目看起来简单,也要考虑各种边界情况,如:
在竞赛中,代码需要既简洁又高效。原代码只用了几行就解决了问题,同时保证了O(1)的时间和空间复杂度。
如果你想进一步练习这类问题,可以尝试以下题目:
这些题目都涉及基本的数学运算和条件判断,可以帮助你巩固这方面的技能。
在解决这类问题时,我有几点经验想分享:
最后,这道题目虽然简单,但它很好地展示了编程竞赛中常见的问题类型和解题思路。通过这类问题的练习,可以培养严谨的编程习惯和全面的思考方式。