|
1 |
| -pub fn perfect_cube(n: i32) -> bool { |
2 |
| - // Calculate the cube root using floating-point arithmetic. |
3 |
| - let val = (n as f64).powf(1.0 / 3.0); |
4 |
| - // Check if the cube of the cube root equals the original number. |
5 |
| - (val * val * val) == (n as f64) |
6 |
| -} |
7 |
| - |
8 | 1 | // Check if a number is a perfect cube using binary search.
|
9 | 2 | pub fn perfect_cube_binary_search(n: i64) -> bool {
|
10 |
| - // Handle negative numbers, as cube roots are not defined for negatives. |
11 | 3 | if n < 0 {
|
12 |
| - return false; |
| 4 | + return perfect_cube_binary_search(-n); |
13 | 5 | }
|
14 | 6 |
|
15 | 7 | // Initialize left and right boundaries for binary search.
|
@@ -39,17 +31,31 @@ pub fn perfect_cube_binary_search(n: i64) -> bool {
|
39 | 31 | mod tests {
|
40 | 32 | use super::*;
|
41 | 33 |
|
42 |
| - #[test] |
43 |
| - fn test_perfect_cube() { |
44 |
| - assert!(perfect_cube_binary_search(27)); |
45 |
| - assert!(!perfect_cube_binary_search(4)); |
| 34 | + macro_rules! test_perfect_cube { |
| 35 | + ($($name:ident: $inputs:expr,)*) => { |
| 36 | + $( |
| 37 | + #[test] |
| 38 | + fn $name() { |
| 39 | + let (n, expected) = $inputs; |
| 40 | + assert_eq!(perfect_cube_binary_search(n), expected); |
| 41 | + assert_eq!(perfect_cube_binary_search(-n), expected); |
| 42 | + } |
| 43 | + )* |
| 44 | + } |
46 | 45 | }
|
47 | 46 |
|
48 |
| - #[test] |
49 |
| - fn test_perfect_cube_binary_search() { |
50 |
| - assert!(perfect_cube_binary_search(27)); |
51 |
| - assert!(perfect_cube_binary_search(64)); |
52 |
| - assert!(!perfect_cube_binary_search(4)); |
53 |
| - assert!(!perfect_cube_binary_search(-8)); |
| 47 | + test_perfect_cube! { |
| 48 | + num_0_a_perfect_cube: (0, true), |
| 49 | + num_1_is_a_perfect_cube: (1, true), |
| 50 | + num_27_is_a_perfect_cube: (27, true), |
| 51 | + num_64_is_a_perfect_cube: (64, true), |
| 52 | + num_8_is_a_perfect_cube: (8, true), |
| 53 | + num_2_is_not_a_perfect_cube: (2, false), |
| 54 | + num_3_is_not_a_perfect_cube: (3, false), |
| 55 | + num_4_is_not_a_perfect_cube: (4, false), |
| 56 | + num_5_is_not_a_perfect_cube: (5, false), |
| 57 | + num_999_is_not_a_perfect_cube: (999, false), |
| 58 | + num_1000_is_a_perfect_cube: (1000, true), |
| 59 | + num_1001_is_not_a_perfect_cube: (1001, false), |
54 | 60 | }
|
55 | 61 | }
|
0 commit comments