From 589f8e2558d008c63892f2345b233e28d889620b Mon Sep 17 00:00:00 2001 From: Olivier Gayot Date: Fri, 8 Sep 2017 20:06:38 +0200 Subject: Added the addition of two numbers We're using the grade school addition method to compute the sum of two numbers of size n. Signed-off-by: Olivier Gayot --- number.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ number.h | 7 +++++++ 2 files changed, 48 insertions(+) diff --git a/number.cpp b/number.cpp index e942cf2..f6f445c 100644 --- a/number.cpp +++ b/number.cpp @@ -1,5 +1,46 @@ #include "number.h" +/* Operations {{{ */ + +number +number::operator+(const number &n) const +{ + /* We make sure our object is greater than or equal to n. */ + if (*this < n) { + return n.operator+(*this); + } + + number result; + + auto it = _operands.cbegin(); + auto it_n = n._operands.cbegin(); + + bool carry = false; + + while (it != _operands.cend()) { + const auto n1 = *it; + const auto n2 = *it_n; + + result._operands.push_back(n1 + n2 + (carry ? 1 : 0)); + + if (carry && (n1 == UINT64_MAX)) { + carry = true; + } else { + carry = ((UINT64_MAX - n1 - (carry ? 1 : 0)) < n2); + } + + ++it; + ++it_n; + } + + if (carry) { + result._operands.push_back(1); + } + + return result; +} + +/* }}} */ /* Comparison operators {{{ */ bool diff --git a/number.h b/number.h index c508a81..ca5075e 100644 --- a/number.h +++ b/number.h @@ -8,6 +8,13 @@ class number { public: number() = default; + /** + * \brief Return the result of the addition of a number and this number. + * + * \param n The number to add to this number. + */ + number operator+(const number &n) const; + /** * \brief Tells whether the number passed as parameter is strictly less * than this number. -- cgit v1.2.3