diff --git a/greedy_algorithms/digit_separation.cpp b/greedy_algorithms/digit_separation.cpp new file mode 100644 index 00000000000..68735741153 --- /dev/null +++ b/greedy_algorithms/digit_separation.cpp @@ -0,0 +1,142 @@ +/** + * @file digit_separation.cpp + * @brief Separates digits from numbers in forward and reverse order + * @see https://www.log2base2.com/c-examples/loop/split-a-number-into-digits-in-c.html + * @details The DigitSeparation class provides two methods to separate the + * digits of large integers: digitSeparationReverseOrder and + * digitSeparationForwardOrder. The digitSeparationReverseOrder method extracts + * digits by repeatedly applying the modulus operation (% 10) to isolate the + * last digit, then divides the number by 10 to remove it. This process + * continues until the entire number is broken down into its digits, which are + * stored in reverse order. If the number is zero, the method directly returns a + * vector containing {0} to handle this edge case. Negative numbers are handled + * by taking the absolute value, ensuring consistent behavior regardless of the + * sign. + * @author [Muhammad Junaid Khalid](https://github.com/mjk22071998) + */ + +#include /// For reveresing the vector +#include /// For assert() function to check for errors +#include /// For abs() function +#include /// For int64_t data type to handle large numbers +#include /// For input/output operations +#include /// For std::vector to store separated digits + +/** + * @namespace + * @brief Greedy Algorithms + */ +namespace greedy_algorithms { + +/** + * @brief A class that provides methods to separate the digits of a large + * positive number. + */ +class DigitSeparation { + public: + /** + * @brief Default constructor for the DigitSeparation class. + */ + DigitSeparation() {} + + /** + * @brief Implementation of digitSeparationReverseOrder method. + * + * @param largeNumber The large number to separate digits from. + * @return A vector of digits in reverse order. + */ + std::vector digitSeparationReverseOrder( + std::int64_t largeNumber) const { + std::vector result; + if (largeNumber != 0) { + while (largeNumber != 0) { + result.push_back(std::abs(largeNumber % 10)); + largeNumber /= 10; + } + } else { + result.push_back(0); + } + return result; + } + + /** + * @brief Implementation of digitSeparationForwardOrder method. + * + * @param largeNumber The large number to separate digits from. + * @return A vector of digits in forward order. + */ + std::vector digitSeparationForwardOrder( + std::int64_t largeNumber) const { + std::vector result = + digitSeparationReverseOrder(largeNumber); + std::reverse(result.begin(), result.end()); + return result; + } +}; + +} // namespace greedy_algorithms + +/** + * @brief self test implementation + * @return void + */ +static void tests() { + greedy_algorithms::DigitSeparation ds; + + // Test case: Positive number + std::int64_t number = 1234567890; + std::vector expectedReverse = {0, 9, 8, 7, 6, 5, 4, 3, 2, 1}; + std::vector expectedForward = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; + std::vector reverseOrder = + ds.digitSeparationReverseOrder(number); + assert(reverseOrder == expectedReverse); + std::vector forwardOrder = + ds.digitSeparationForwardOrder(number); + assert(forwardOrder == expectedForward); + + // Test case: Single digit number + number = 5; + expectedReverse = {5}; + expectedForward = {5}; + reverseOrder = ds.digitSeparationReverseOrder(number); + assert(reverseOrder == expectedReverse); + forwardOrder = ds.digitSeparationForwardOrder(number); + assert(forwardOrder == expectedForward); + + // Test case: Zero + number = 0; + expectedReverse = {0}; + expectedForward = {0}; + reverseOrder = ds.digitSeparationReverseOrder(number); + assert(reverseOrder == expectedReverse); + forwardOrder = ds.digitSeparationForwardOrder(number); + assert(forwardOrder == expectedForward); + + // Test case: Large number + number = 987654321012345; + expectedReverse = {5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + expectedForward = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5}; + reverseOrder = ds.digitSeparationReverseOrder(number); + assert(reverseOrder == expectedReverse); + forwardOrder = ds.digitSeparationForwardOrder(number); + assert(forwardOrder == expectedForward); + + // Test case: Negative number + number = -987654321012345; + expectedReverse = {5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + expectedForward = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5}; + reverseOrder = ds.digitSeparationReverseOrder(number); + assert(reverseOrder == expectedReverse); + forwardOrder = ds.digitSeparationForwardOrder(number); + assert(forwardOrder == expectedForward); +} + +/** + * @brief main function + * @return 0 on successful exit + */ +int main() { + tests(); // run self test implementation + + return 0; +}