Cleanup SumOfDigits and its tests (#4994)

This commit is contained in:
Piotr Idzik
2024-01-05 22:05:52 +01:00
committed by GitHub
parent 1ea95ffa92
commit 8930ab5b16
2 changed files with 32 additions and 45 deletions

View File

@ -1,13 +1,7 @@
package com.thealgorithms.maths; package com.thealgorithms.maths;
public class SumOfDigits { public final class SumOfDigits {
private SumOfDigits() {
public static void main(String[] args) {
assert sumOfDigits(-123) == 6 && sumOfDigitsRecursion(-123) == 6 && sumOfDigitsFast(-123) == 6;
assert sumOfDigits(0) == 0 && sumOfDigitsRecursion(0) == 0 && sumOfDigitsFast(0) == 0;
assert sumOfDigits(12345) == 15 && sumOfDigitsRecursion(12345) == 15 && sumOfDigitsFast(12345) == 15;
} }
/** /**
@ -17,12 +11,12 @@ public class SumOfDigits {
* @return sum of digits of given {@code number} * @return sum of digits of given {@code number}
*/ */
public static int sumOfDigits(int number) { public static int sumOfDigits(int number) {
number = number < 0 ? -number : number; final int base = 10;
/* calculate abs value */ number = Math.abs(number);
int sum = 0; int sum = 0;
while (number != 0) { while (number != 0) {
sum += number % 10; sum += number % base;
number /= 10; number /= base;
} }
return sum; return sum;
} }
@ -34,9 +28,9 @@ public class SumOfDigits {
* @return sum of digits of given {@code number} * @return sum of digits of given {@code number}
*/ */
public static int sumOfDigitsRecursion(int number) { public static int sumOfDigitsRecursion(int number) {
number = number < 0 ? -number : number; final int base = 10;
/* calculate abs value */ number = Math.abs(number);
return number < 10 ? number : number % 10 + sumOfDigitsRecursion(number / 10); return number < base ? number : number % base + sumOfDigitsRecursion(number / base);
} }
/** /**
@ -45,14 +39,7 @@ public class SumOfDigits {
* @param number the number contains digits * @param number the number contains digits
* @return sum of digits of given {@code number} * @return sum of digits of given {@code number}
*/ */
public static int sumOfDigitsFast(int number) { public static int sumOfDigitsFast(final int number) {
number = number < 0 ? -number : number; return String.valueOf(Math.abs(number)).chars().map(c -> c - '0').reduce(0, Integer::sum);
/* calculate abs value */
char[] digits = (number + "").toCharArray();
int sum = 0;
for (int i = 0; i < digits.length; ++i) {
sum += digits[i] - '0';
}
return sum;
} }
} }

View File

@ -1,31 +1,31 @@
package com.thealgorithms.maths; package com.thealgorithms.maths;
import static org.junit.jupiter.api.Assertions.*; import java.util.stream.Stream;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
class SumOfDigitsTest { class SumOfDigitsTest {
@ParameterizedTest
SumOfDigits SoD = new SumOfDigits(); @MethodSource("testCases")
void sumOfDigitsTest(final int expected, final int input) {
@Test Assertions.assertEquals(expected, SumOfDigits.sumOfDigits(input));
void testZero() {
assertEquals(0, SumOfDigits.sumOfDigits(0));
assertEquals(0, SumOfDigits.sumOfDigitsRecursion(0));
assertEquals(0, SumOfDigits.sumOfDigitsFast(0));
} }
@Test @ParameterizedTest
void testPositive() { @MethodSource("testCases")
assertEquals(15, SumOfDigits.sumOfDigits(12345)); void sumOfDigitsRecursionTest(final int expected, final int input) {
assertEquals(15, SumOfDigits.sumOfDigitsRecursion(12345)); Assertions.assertEquals(expected, SumOfDigits.sumOfDigitsRecursion(input));
assertEquals(15, SumOfDigits.sumOfDigitsFast(12345));
} }
@Test @ParameterizedTest
void testNegative() { @MethodSource("testCases")
assertEquals(6, SumOfDigits.sumOfDigits(-123)); void sumOfDigitsFastTest(final int expected, final int input) {
assertEquals(6, SumOfDigits.sumOfDigitsRecursion(-123)); Assertions.assertEquals(expected, SumOfDigits.sumOfDigitsFast(input));
assertEquals(6, SumOfDigits.sumOfDigitsFast(-123)); }
private static Stream<Arguments> testCases() {
return Stream.of(Arguments.of(0, 0), Arguments.of(1, 1), Arguments.of(15, 12345), Arguments.of(6, -123), Arguments.of(1, -100000), Arguments.of(8, 512));
} }
} }