- Check
3·3·3
Check Cube Number in JavaScript
What you’ll learn
- What it means for an integer to be a perfect cube (
n = k3). - A compact check using
Math.cbrtandMath.round(with a finalBigIntcube test), plus an all-integer loop like the range sample. - Sign, zero, overflow, and floating-point caveats, plus a browser live preview.
Overview
Given an integer n, decide whether n = k3 for some integer k. One approach uses the real cube root from Math.cbrt; we round it correctly for negatives, then verify with exact integer cubing (BigInt).
Two programs
Math.cbrt + Math.round for a single value, then a linear k scan for the 1–50 listing.
Live preview
Try integers in the safe JS range; uses a BigInt cube test (no math.h in the browser).
Fixes vs naive round
Avoid biased trunc(cbrt(n) + 0.5) on negative n; widen cubes with BigInt when needed.
Prerequisites
console.log, integer multiplication, and (for Example 1) Math.cbrt, Math.round, and BigInt for the final cube comparison.
Number.isSafeIntegerfor inputs that must stay exact inNumber.BigIntliterals (3n) and exponentiation**for exact cubes.
What is a perfect cube?
An integer n is a perfect cube (cube number) if n = k3 for some integer k. That includes 0 = 03 and negative examples such as -8 = (-2)3.
Do not confuse “cube number” with “multiple of 3” or “square”; the operation is cubing, not squaring.
Cube root characterization
For real x, the equation k3 = x has a unique real cube root k. For integer n, n is a perfect cube iff that real root is an integer—equivalently some rounded float estimate k satisfies k3 = n once checked in exact integer arithmetic.
n = 27Real cube root of 27 is 3, and 33 = 27.
Intuition
- Near
- between
33and43
Takeaway: perfect cubes grow quickly in gaps: 1, 8, 27, 64, …
Live preview
JavaScript safe integers. Integer cube test: take sign, grow k on |n| with BigInt until k3 ≥ |n|, then compare.
Algorithm
Goal: return true iff n = k3 for some integer k.
Floating route
Compute k = Math.round(Math.cbrt(n)), then verify BigInt(k) ** 3n === BigInt(n).
Integer route
For nonnegative n, increment k from 0 until k3 ≥ n; answer yes iff equality (widen with BigInt for large n).
📜 Pseudocode
function isPerfectCubeNonneg(n): // n ≥ 0
k ← 0
while k * k * k < n:
k ← k + 1
return k * k * k = nMath.cbrt + Math.round + exact cube check
Math.round avoids naive trunc(cbrt(n) + 0.5) bugs on negative cubes such as -27. The cube is checked with BigInt so the product never silently overflows a Number.
function isCube(number) {
const k = Math.round(Math.cbrt(number));
return BigInt(k) ** 3n === BigInt(number);
}
const inputNumber = 27;
if (isCube(inputNumber)) {
console.log(inputNumber + " is a cube number.");
} else {
console.log(inputNumber + " is not a cube number.");
}Explanation
Math.cbrt returns an IEEE double; for integers within Number.MAX_SAFE_INTEGER, Math.round usually recovers the true integer root, and BigInt confirms it. For integers beyond exact double range, prefer the pure integer route.
BigInt(k) ** 3n === BigInt(number)Verify in integers. Confirms the rounded root truly cubes back to number.
Integer scan: cubes from 1 to 50
Same output as the reference: 1 8 27. Uses nonnegative k only; BigInt widening matches the C long long cast pattern for larger num.
function isCubeNumber(num) {
let k = 0;
while (BigInt(k) * BigInt(k) * BigInt(k) < BigInt(num)) {
k++;
}
return BigInt(k) ** 3n === BigInt(num);
}
console.log("Cube numbers in the range 1 to 50:");
let line = "";
for (let i = 1; i <= 50; i++) {
if (isCubeNumber(i)) {
line += i + " ";
}
}
console.log(line.trim());Explanation
The loop finds the smallest k with k3 ≥ num. If num is a perfect cube, equality holds; otherwise k3 overshoots.
BigInt(k) * BigInt(k) * BigInt(k)Widen before multiply so intermediate products stay defined for larger inputs.
Optimization
Binary search on k. For huge nonnegative n, binary-search k in [0, n] (or a tighter upper bound) instead of stepping by one.
No Math. Newton’s method on f(k)=k3-n can approximate k, but you still need an exact integer final check.
Interview: mention sign, 0, overflow, and why you verify k3 in integers after any float step.
❓ FAQ
🔄 Input / output examples
Swap inputNumber in Example 1 or extend the loop in Example 2.
| n | Perfect cube? | k |
|---|---|---|
27 | Yes | 3 |
-8 | Yes | -2 |
28 | No | — |
0 | Yes | 0 |
Edge cases and pitfalls
Rounding cube roots in floating point without a final integer check is fragile; naive +0.5 truncation is wrong for several negative values.
Math.cbrt on negatives
Math.cbrt is defined for negative reals. Pair it with Math.round, not biased-half truncation via + 0.5 and Math.trunc.
n = 0
Perfect cube: 03. The integer loop must start at k = 0 (Example 2 already does when reused for nonnegative num).
k * k * k in Number
For large k, the product can exceed Number.MAX_SAFE_INTEGER before comparison. Use BigInt for the cube, as in the samples.
Huge integers
IEEE double cannot represent all integers past 253 exactly; stick to integer or BigInt methods for big integers.
⏱️ Time and space complexity
| Method | Time | Extra space |
|---|---|---|
Math.cbrt + verify | O(1) typical library cost | O(1) |
Linear k scan (nonnegative) | O(n1/3) iterations | O(1) |
Binary search on k | O(log n) iterations | O(1) |
Here n denotes the magnitude of the input for the scan bound k ≈ n1/3.
Summary
- Definition:
n = k3for some integerk(includes0and negatives). - Code:
Math.round(Math.cbrt(n))thenBigIntcube-check, or pure integer increment / binary search. - Watch-outs: negative rounding, overflow in
k3,Numberprecision limits.
A nonzero integer n is a perfect cube iff in its prime factorization every exponent is a multiple of three. The cube roots of 0 and 1 are 0 and 1 themselves.
8 people found this page helpful
