Skip to content

Commit 9d03694

Browse files
authored
Add Sum of Digits (#498)
1 parent 896a086 commit 9d03694

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed

src/math/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ mod signum;
3838
mod simpson_integration;
3939
mod sine;
4040
mod square_root;
41+
mod sum_of_digits;
4142
mod trial_division;
4243
mod zellers_congruence_algorithm;
4344

@@ -87,5 +88,6 @@ pub use self::signum::signum;
8788
pub use self::simpson_integration::simpson_integration;
8889
pub use self::sine::sine;
8990
pub use self::square_root::{fast_inv_sqrt, square_root};
91+
pub use self::sum_of_digits::{sum_digits_iterative, sum_digits_recursive};
9092
pub use self::trial_division::trial_division;
9193
pub use self::zellers_congruence_algorithm::zellers_congruence_algorithm;

src/math/sum_of_digits.rs

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/// Iteratively sums the digits of a signed integer
2+
///
3+
/// ## Arguments
4+
///
5+
/// * `num` - The number to sum the digits of
6+
///
7+
/// ## Examples
8+
///
9+
/// ```
10+
/// use the_algorithms_rust::math::sum_digits_iterative;
11+
///
12+
/// assert_eq!(10, sum_digits_iterative(1234));
13+
/// assert_eq!(12, sum_digits_iterative(-246));
14+
/// ```
15+
pub fn sum_digits_iterative(num: i32) -> u32 {
16+
// convert to unsigned integer
17+
let mut num: u32 = num.unsigned_abs();
18+
// initialize sum
19+
let mut result: u32 = 0;
20+
21+
// iterate through digits
22+
while num > 0 {
23+
// extract next digit and add to sum
24+
result += num % 10;
25+
num /= 10; // chop off last digit
26+
}
27+
result
28+
}
29+
30+
/// Recursively sums the digits of a signed integer
31+
///
32+
/// ## Arguments
33+
///
34+
/// * `num` - The number to sum the digits of
35+
///
36+
/// ## Examples
37+
///
38+
/// ```
39+
/// use the_algorithms_rust::math::sum_digits_recursive;
40+
///
41+
/// assert_eq!(10, sum_digits_recursive(1234));
42+
/// assert_eq!(12, sum_digits_recursive(-246));
43+
/// ```
44+
pub fn sum_digits_recursive(num: i32) -> u32 {
45+
// convert to unsigned integer
46+
let num: u32 = num.unsigned_abs();
47+
// base case
48+
if num < 10 {
49+
return num;
50+
}
51+
// recursive case: add last digit to sum of remaining digits
52+
num % 10 + sum_digits_recursive((num / 10) as i32)
53+
}
54+
55+
#[cfg(test)]
56+
mod tests {
57+
mod iterative {
58+
// import relevant sum_digits function
59+
use super::super::sum_digits_iterative as sum_digits;
60+
61+
#[test]
62+
fn zero() {
63+
assert_eq!(0, sum_digits(0));
64+
}
65+
#[test]
66+
fn positive_number() {
67+
assert_eq!(1, sum_digits(1));
68+
assert_eq!(10, sum_digits(1234));
69+
assert_eq!(14, sum_digits(42161));
70+
assert_eq!(6, sum_digits(500010));
71+
}
72+
#[test]
73+
fn negative_number() {
74+
assert_eq!(1, sum_digits(-1));
75+
assert_eq!(12, sum_digits(-246));
76+
assert_eq!(2, sum_digits(-11));
77+
assert_eq!(14, sum_digits(-42161));
78+
assert_eq!(6, sum_digits(-500010));
79+
}
80+
#[test]
81+
fn trailing_zeros() {
82+
assert_eq!(1, sum_digits(1000000000));
83+
assert_eq!(3, sum_digits(300));
84+
}
85+
}
86+
87+
mod recursive {
88+
// import relevant sum_digits function
89+
use super::super::sum_digits_recursive as sum_digits;
90+
91+
#[test]
92+
fn zero() {
93+
assert_eq!(0, sum_digits(0));
94+
}
95+
#[test]
96+
fn positive_number() {
97+
assert_eq!(1, sum_digits(1));
98+
assert_eq!(10, sum_digits(1234));
99+
assert_eq!(14, sum_digits(42161));
100+
assert_eq!(6, sum_digits(500010));
101+
}
102+
#[test]
103+
fn negative_number() {
104+
assert_eq!(1, sum_digits(-1));
105+
assert_eq!(12, sum_digits(-246));
106+
assert_eq!(2, sum_digits(-11));
107+
assert_eq!(14, sum_digits(-42161));
108+
assert_eq!(6, sum_digits(-500010));
109+
}
110+
#[test]
111+
fn trailing_zeros() {
112+
assert_eq!(1, sum_digits(1000000000));
113+
assert_eq!(3, sum_digits(300));
114+
}
115+
}
116+
}

0 commit comments

Comments
 (0)