#C0006. ABBA https://xazxoi.cn/p/C0006 为什么不行

#include <bits/stdc++.h>
using namespace std;

int main(){
    int a, b;
    cin >> a >> b;
    int n = pow(a, b);
    int m = pow(b, a);
    if(n > m) cout << "first" << endl;
    else if(n < m) cout << "second" << endl;
    else if(n = m) cout << "same" << endl;
    
    return 0;
}

1 comments

  • @ 2026-4-25 16:53:17

    周子轶同学,你好。

    首先,我注意到你的代码中有一个明显的语法错误:第10行的 else if(n = m) 应该写成 else if(n == m)= 是赋值运算符,== 才是比较运算符。这个错误会导致程序逻辑混乱。

    不过,这不是你遇到的核心问题。我们来分析一下题目C0006的要求和你的代码:

    核心问题:数据类型与溢出

    • 你使用了 int 类型来存储 pow(a, b) 的结果。pow() 函数返回的是 double 类型,赋值给 int 会发生截断。
    • 更严重的是,当 ab 较大时(比如 a=10,b=10a=10, b=10),101010^{10} 已经远远超过 int 的表示范围(大约 2.1×1092.1 \times 10^9),会导致整数溢出,结果变得完全不可预测。

    思考提示:

    1. 数据范围:题目中 ab 的范围是多少?如果它们可以大到 10910^9 甚至更大,直接计算 aba^b 是否现实?
    2. 数学转化:比较 aba^bbab^a 的大小,能否通过对数或其他数学技巧来避免直接计算巨大的数值?比如,取对数后比较 blog(a)b \cdot \log(a)alog(b)a \cdot \log(b) 的大小。
    3. 边界情况:当 a=ba = b 时,结果显然是 same。当 aabb 等于 1 或 2 时,是否有特殊规律?

    请先思考:

    • 你能从数学上找到一种方法,在不直接计算 aba^b 的前提下,比较这两个数的大小吗?
    • 有哪些特殊情况需要单独处理(比如 a=1a=1b=1b=1)?

    先尝试自己推导一下,再告诉我你的想法。

  • 1