题解:洛谷 B4001 立方数
【题目来源】
洛谷:B4001 [GESP202406 一级] 立方数 - 洛谷
【题目描述】
小杨有一个正整数\(n\),他想知道\(n\)是否是一个立方数。
一个正整数\(n\)是立方数当且仅当存在一个正整数\(x\)满足\(x \times x \times x = n\)。
【输入】
第一行包含一个正整数\(n\)。
【输出】
如果正整数\(n\)是一个立方数,输出Yes,否则输出No。
【输入样例】
8
【输出样例】
Yes
【核心思想】
-
问题分析:给定正整数 \(n\),判断是否存在正整数 \(x\) 使得 \(x^3 = n\)。这是一个立方数判定问题,核心在于通过枚举或数学方法验证 \(n\) 是否为完全立方数。
-
算法选择:
- 枚举验证:遍历 \(i\) 从 \(1\) 到 \(n\),检查是否存在 \(i^3 = n\)
- 提前终止:一旦找到满足条件的 \(i\) 立即退出循环
-
关键步骤:
- 读入数据:读取 \(n\)
- 枚举验证(\(i\) 从 \(1\) 到 \(n\)):
- 若 \(i \times i \times i = n\):\(fl \leftarrow 1\),\(break\)
- 若 \(i \times i \times i > n\):可提前终止(优化)
- 输出结果:若 \(fl = 1\) 输出
Yes,否则输出No
-
时间/空间复杂度:
- 时间复杂度:\(O(\sqrt[3]{n})\),实际只需枚举到 \(n^{1/3}\),超过时 \(i^3 > n\)
- 空间复杂度:\(O(1)\)
-
枚举验证的核心思想:
- 立方根上界:由于 \(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
浙公网安备 33010602011771号