- Check
3·3·3
Check Cube Number in Java
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 final integer cube 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. The reference idea uses the real cube root from Math.cbrt; we round it correctly, then verify with integer cubing.
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 integer cube detection (no floating-point cube root in the browser).
Fixes vs naive round
Avoid (int)(Math.cbrt(n) + 0.5) on negatives; use Math.round and always confirm with an integer cube check.
Prerequisites
public static void main(String[] args), integer multiplication, and (for Example 1) Math.cbrt / Math.round.
- Comfort with loops and
ifstatements in Java. - Optional: why we widen to
longwhen computingk * k * k.
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: adjust sign for nonzero n, grow k 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)) as a long or int, then verify k*k*k == n using a wide enough type.
Integer route
For nonnegative n, increment k from 0 until k3 ≥ n; answer true iff equality.
📜 Pseudocode
function isPerfectCubeNonneg(n): // n ≥ 0
k ← 0
while k * k * k < n:
k ← k + 1
return k * k * k = nMath.cbrt + Math.round + integer check
Uses Java’s Math.cbrt. Math.round fixes the naive (int)(Math.cbrt(n)+0.5) bug on negative cubes such as -27. Cubes are evaluated in long to reduce overflow risk for borderline int values.
public class Main {
static boolean isCube(int number) {
long k = Math.round(Math.cbrt(number));
long c = k * k * k;
return c == number;
}
public static void main(String[] args) {
int inputNumber = 27;
if (isCube(inputNumber)) {
System.out.println(inputNumber + " is a cube number.");
} else {
System.out.println(inputNumber + " is not a cube number.");
}
}
}Explanation
Math.cbrt returns a double. Rounding to the nearest integer and then cubing in long lets us check the result exactly for typical int ranges.
long c = k * k * k;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; for larger num you would keep the cube in long.
public class Main {
static boolean isCubeNumber(int num) {
int k = 0;
while ((long) k * k * k < (long) num) {
k++;
}
return (long) k * k * k == (long) num;
}
public static void main(String[] args) {
System.out.println("Cube numbers in the range 1 to 50:");
for (int i = 1; i <= 50; i++) {
if (isCubeNumber(i)) {
System.out.print(i + " ");
}
}
System.out.println();
}
}Explanation
The loop finds the smallest k with k3 ≥ num. If num is a perfect cube, equality holds; otherwise k3 overshoots.
(long) k * k * kWiden 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 floating-point. You can skip Math.cbrt entirely by using only integer search plus a cube 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 a cast.
n = 0
Perfect cube: 03. The integer loop must start at k = 0 for nonnegative num.
k * k * k in int
For large k, the product can overflow int before comparison. Cast or store in long.
Huge integers
IEEE double cannot represent all integers past 253 exactly; stick to integer 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))then cube-check, or pure integer increment / binary search. - Watch-outs: negative rounding, overflow in
k3, anddoubleprecision 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
