Skip to content

Commit cb4760c

Browse files
Add perfect cube numeric algorithm (#494)
1 parent d59c28a commit cb4760c

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using Algorithms.Numeric;
2+
using NUnit.Framework;
3+
4+
namespace Algorithms.Tests.Numeric;
5+
6+
public static class PerfectCubeTests
7+
{
8+
[TestCase(-27, ExpectedResult = true)]
9+
[TestCase(27, ExpectedResult = true)]
10+
[TestCase(4, ExpectedResult = false)]
11+
[TestCase(64, ExpectedResult = true)]
12+
[TestCase(0, ExpectedResult = true)]
13+
[TestCase(1, ExpectedResult = true)]
14+
[TestCase(8, ExpectedResult = true)]
15+
[TestCase(9, ExpectedResult = false)]
16+
public static bool IsPerfectCube_ResultIsCorrect(int number)
17+
{
18+
// Act
19+
var result = PerfectCubeChecker.IsPerfectCube(number);
20+
21+
// Assert
22+
return result;
23+
}
24+
25+
[TestCase(-27, ExpectedResult = true)]
26+
[TestCase(27, ExpectedResult = true)]
27+
[TestCase(4, ExpectedResult = false)]
28+
[TestCase(64, ExpectedResult = true)]
29+
[TestCase(0, ExpectedResult = true)]
30+
[TestCase(1, ExpectedResult = true)]
31+
[TestCase(8, ExpectedResult = true)]
32+
[TestCase(9, ExpectedResult = false)]
33+
public static bool IsPerfectCubeBinarySearch_ResultIsCorrect(int number)
34+
{
35+
// Act
36+
var result = PerfectCubeChecker.IsPerfectCubeBinarySearch(number);
37+
38+
// Assert
39+
return result;
40+
}
41+
}
+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
3+
namespace Algorithms.Numeric;
4+
5+
/// <summary>
6+
/// A perfect cube is an element of algebraic structure that is equal to the cube of another element.
7+
/// </summary>
8+
public static class PerfectCubeChecker
9+
{
10+
/// <summary>
11+
/// Checks if a number is a perfect cube or not.
12+
/// </summary>
13+
/// <param name="number">Number to check.</param>
14+
/// <returns>True if is a perfect cube; False otherwise.</returns>
15+
public static bool IsPerfectCube(int number)
16+
{
17+
if (number < 0)
18+
{
19+
number = -number;
20+
}
21+
22+
var cubeRoot = Math.Round(Math.Pow(number, 1.0 / 3.0));
23+
return Math.Abs(cubeRoot * cubeRoot * cubeRoot - number) < 1e-6;
24+
}
25+
26+
/// <summary>
27+
/// Checks if a number is a perfect cube or not using binary search.
28+
/// </summary>
29+
/// <param name="number">Number to check.</param>
30+
/// <returns>True if is a perfect cube; False otherwise.</returns>
31+
public static bool IsPerfectCubeBinarySearch(int number)
32+
{
33+
if (number < 0)
34+
{
35+
number = -number;
36+
}
37+
38+
int left = 0;
39+
int right = number;
40+
while (left <= right)
41+
{
42+
int mid = left + (right - left) / 2;
43+
int midCubed = mid * mid * mid;
44+
if (midCubed == number)
45+
{
46+
return true;
47+
}
48+
else if (midCubed < number)
49+
{
50+
left = mid + 1;
51+
}
52+
else
53+
{
54+
right = mid - 1;
55+
}
56+
}
57+
58+
return false;
59+
}
60+
}

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ find more than one implementation for the same objective but using different alg
9090
* [Keith Number Checker](./Algorithms/Numeric/KeithNumberChecker.cs)
9191
* [Pseudo-Inverse](./Algorithms/Numeric/Pseudoinverse/PseudoInverse.cs)
9292
* [Narcissistic Number Checker](./Algorithms/Numeric/NarcissisticNumberChecker.cs)
93+
* [Perfect Cube Checker](./Algorithms/Numeric/PerfectCubeChecker.cs)
9394
* [Perfect Number Checker](./Algorithms/Numeric/PerfectNumberChecker.cs)
9495
* [Perfect Square Checker](./Algorithms/Numeric/PerfectSquareChecker.cs)
9596
* [Euler Method](./Algorithms/Numeric/EulerMethod.cs)

0 commit comments

Comments
 (0)