Skip to content
Merged
Changes from 13 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
47af70e
Digit Separation Algorithm added
mjk22071998 Oct 5, 2024
48f42a7
Merge branch 'TheAlgorithms:master' into master
mjk22071998 Oct 5, 2024
011c4e2
feat: Added namespace greedy_algoriithms
mjk22071998 Oct 5, 2024
76edb15
"Updated digit separation code: added comments and docstrings, change…
mjk22071998 Oct 5, 2024
57f61a6
feat: Made test function and removed extra whitespaces
mjk22071998 Oct 5, 2024
9c0034c
removed some more whitespaces
mjk22071998 Oct 5, 2024
cba0eb9
Update greedy_algorithms/digit_separation.cpp
mjk22071998 Oct 5, 2024
d3edb52
fix: terminate multiline comment
realstealthninja Oct 5, 2024
1fb86db
Update greedy_algorithms/digit_separation.cpp
mjk22071998 Oct 5, 2024
ad03474
Update greedy_algorithms/digit_separation.cpp
mjk22071998 Oct 5, 2024
5f392b9
Update greedy_algorithms/digit_separation.cpp
mjk22071998 Oct 5, 2024
373e1df
Update greedy_algorithms/digit_separation.cpp
mjk22071998 Oct 5, 2024
af077d2
Corrected test function
mjk22071998 Oct 5, 2024
18b6546
Update greedy_algorithms/digit_separation.cpp
mjk22071998 Oct 5, 2024
87b955b
Update greedy_algorithms/digit_separation.cpp
mjk22071998 Oct 5, 2024
a585834
remove redundant declaration
mjk22071998 Oct 5, 2024
ef954a8
Corrected tests
mjk22071998 Oct 5, 2024
1427474
file clang linted
mjk22071998 Oct 6, 2024
a0f488b
Merge branch 'master' into master
mjk22071998 Oct 6, 2024
051448f
Merge branch 'master' into master
mjk22071998 Oct 6, 2024
3f04892
"Moved method implementations from outside to inside class definition"
mjk22071998 Oct 6, 2024
ba56880
fowardOrder to forwardOrder on line 122
mjk22071998 Oct 6, 2024
40ac103
Removed Class scope resolution form digitSeparationReverseOrder function
mjk22071998 Oct 6, 2024
12d8d53
Removed Class scope resolution form digitSeparationForwardOrderfunction
mjk22071998 Oct 6, 2024
28f6901
docs: documentation updated
mjk22071998 Oct 6, 2024
c9cd9a3
Merge branch 'master' of https://github.com/mjk22071998/C-Plus-Plus
mjk22071998 Oct 6, 2024
6c8305b
Merge branch 'master' into master
realstealthninja Oct 7, 2024
cffb85a
Merge branch 'master' into master
realstealthninja Oct 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 150 additions & 0 deletions greedy_algorithms/digit_separation.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
/**
* @file digit_separation.cpp
* @brief This file contains the DigitSeparation class for separating digits of large numbers.
* https://www.log2base2.com/c-examples/loop/split-a-number-into-digits-in-c.html
* @details
* @author [Muhammad Junaid Khalid](https://github.com/mjk22071998)
*/

#include <algorithm> /// For reveresing the vector
#include <cmath> /// For abs() function
#include <iostream> /// For input/output operations
#include <vector> /// For std::vector to store separated digits
#include <cassert> /// For assert() function to check for errors
#include <cstdint> /// For int64_t data type to handle large numbers

/**
* @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 Separates the digits of a large positive number into a vector in
* reverse order.
*
* @param largeNumber The large number to separate digits from.
* @return A vector of digits in reverse order.
*/
std::vector<std::int64_t> digitSeparationReverseOrder(
std::int64_t largeNumber) const;

/**
* @brief Separates the digits of a large positive number into a vector in
* forward order.
*
* @param largeNumber The large number to separate digits from.
* @return A vector of digits in forward order.
*/
std::vector<std::int64_t> digitSeparationForwardOrder(
std::int64_t largeNumber) const;
};

/**
* @brief Implementation of digitSeparationReverseOrder method.
*
* @param largeNumber The large number to separate digits from.
* @return A vector of digits in reverse order.
*/
std::vector<std::int64_t> DigitSeparation::digitSeparationReverseOrder(
std::int64_t largeNumber) const {
std::vector<std::int64_t> 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<std::int64_t> DigitSeparation::digitSeparationForwardOrder(
std::int64_t largeNumber) const {
std::vector<std::int64_t> result = digitSeparationReverseOrder(largeNumber);
std::reverse(result.begin(), result.end());
return result;
}
}

/**
* @brief main function
* @return 0 on sucessful exit
*/
void tests(){
greedy_algorithms::DigitSeparation ds;

// Test case: Positive number
std::int64_t number = 1234567890;
std::vector<std::int64_t> expectedReverse = {0, 9, 8, 7, 6, 5, 4, 3, 2, 1};
std::vector<std::int64_t> expectedForward = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
std::vector<std::int64_t> reverseOrder = ds.digitSeparationReverseOrder(number);
assert(reverseOrder == expectedReverse);
std::vector<std::int64_t> 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};
std::vector<std::int64_t> reverseOrder = ds.digitSeparationReverseOrder(number);
assert(reverseOrder == expectedReverse);
reverseOrder = ds.digitSeparationReverseOrder(number);
assert(reverseOrder == expectedReverse);
}


/**
* @brief main function
* @return 0 on successful exit
*/
int main() {
tests(); // run self test implementation

return 0;
}