题解:洛谷 B4001 立方数

【题目来源】

洛谷:B4001 [GESP202406 一级] 立方数 - 洛谷

【题目描述】

小杨有一个正整数\(n\),他想知道\(n\)是否是一个立方数。

一个正整数\(n\)是立方数当且仅当存在一个正整数\(x\)满足\(x \times x \times x = n\)

【输入】

第一行包含一个正整数\(n\)

【输出】

如果正整数\(n\)是一个立方数,输出Yes,否则输出No。

【输入样例】

8

【输出样例】

Yes

【核心思想】

  1. 问题分析:给定正整数 \(n\),判断是否存在正整数 \(x\) 使得 \(x^3 = n\)。这是一个立方数判定问题,核心在于通过枚举或数学方法验证 \(n\) 是否为完全立方数。

  2. 算法选择

    • 枚举验证:遍历 \(i\)\(1\)\(n\),检查是否存在 \(i^3 = n\)
    • 提前终止:一旦找到满足条件的 \(i\) 立即退出循环
  3. 关键步骤

    • 读入数据:读取 \(n\)
    • 枚举验证\(i\)\(1\)\(n\)):
      • \(i \times i \times i = n\)\(fl \leftarrow 1\)\(break\)
      • \(i \times i \times i > n\):可提前终止(优化)
    • 输出结果:若 \(fl = 1\) 输出 Yes,否则输出 No
  4. 时间/空间复杂度

    • 时间复杂度:\(O(\sqrt[3]{n})\),实际只需枚举到 \(n^{1/3}\),超过时 \(i^3 > n\)
    • 空间复杂度:\(O(1)\)
  5. 枚举验证的核心思想

    • 立方根上界:由于 \(i^3\) 增长迅速,当 \(i > \sqrt[3]{n}\) 时必有 \(i^3 > n\),因此枚举范围实际为 \([1, \lfloor n^{1/3} \rfloor]\),远小于 \(n\)
    • 提前终止优化:找到满足条件的 \(i\) 后立即 \(break\),避免不必要的后续枚举;若 \(i^3 > n\) 也可提前终止
    • 整数溢出的潜在风险:当 \(n\) 较大时,\(i \times i \times i\) 可能溢出 int 范围,应使用 long long 或提前判断 \(i > \sqrt[3]{INT\_MAX}\)
    • 适用于基础数论判定、幂次验证类入门问题

【算法标签】

入门 #模拟

【代码详解】

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

int main()
{
    int n;           // 输入的数字
    cin >> n;        // 读取数字

    int fl = 0;      // 标志变量,0表示不是完全立方数,1表示是

    // 遍历1到n,检查是否有数的立方等于n
    for (int i = 1; i <= n; i++) {
        if (i * i * i == n) {  // 检查i的立方是否等于n
            fl = 1;            // 找到完全立方数
            break;             // 找到后立即退出循环
        }
    }

    // 根据标志变量输出结果
    if (fl)
        cout << "Yes" << endl;  // 是完全立方数
    else
        cout << "No" << endl;   // 不是完全立方数

    return 0;
}

【运行结果】

8
Yes
posted @ 2026-07-16 16:37  团爸讲算法  阅读(16)  评论(0)    收藏  举报