Skip to content

Cleanup SumOfDigits and its tests #4994

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
35 changes: 11 additions & 24 deletions src/main/java/com/thealgorithms/maths/SumOfDigits.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
package com.thealgorithms.maths;

public class 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;
public final class SumOfDigits {
private SumOfDigits() {
}

/**
Expand All @@ -17,12 +11,12 @@ public static void main(String[] args) {
* @return sum of digits of given {@code number}
*/
public static int sumOfDigits(int number) {
number = number < 0 ? -number : number;
/* calculate abs value */
final int base = 10;
number = Math.abs(number);
int sum = 0;
while (number != 0) {
sum += number % 10;
number /= 10;
sum += number % base;
number /= base;
}
return sum;
}
Expand All @@ -34,9 +28,9 @@ public static int sumOfDigits(int number) {
* @return sum of digits of given {@code number}
*/
public static int sumOfDigitsRecursion(int number) {
number = number < 0 ? -number : number;
/* calculate abs value */
return number < 10 ? number : number % 10 + sumOfDigitsRecursion(number / 10);
final int base = 10;
number = Math.abs(number);
return number < base ? number : number % base + sumOfDigitsRecursion(number / base);
}

/**
Expand All @@ -45,14 +39,7 @@ public static int sumOfDigitsRecursion(int number) {
* @param number the number contains digits
* @return sum of digits of given {@code number}
*/
public static int sumOfDigitsFast(int number) {
number = number < 0 ? -number : number;
/* calculate abs value */
char[] digits = (number + "").toCharArray();
int sum = 0;
for (int i = 0; i < digits.length; ++i) {
sum += digits[i] - '0';
}
return sum;
public static int sumOfDigitsFast(final int number) {
return String.valueOf(Math.abs(number)).chars().map(c -> c - '0').reduce(0, Integer::sum);
}
}
40 changes: 20 additions & 20 deletions src/test/java/com/thealgorithms/maths/SumOfDigitsTest.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
package com.thealgorithms.maths;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import java.util.stream.Stream;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

class SumOfDigitsTest {
@ParameterizedTest
@MethodSource("testCases")
void sumOfDigitsTest(final int expected, final int input) {
Assertions.assertEquals(expected, SumOfDigits.sumOfDigits(input));
}

SumOfDigits SoD = new SumOfDigits();

@Test
void testZero() {
assertEquals(0, SumOfDigits.sumOfDigits(0));
assertEquals(0, SumOfDigits.sumOfDigitsRecursion(0));
assertEquals(0, SumOfDigits.sumOfDigitsFast(0));
@ParameterizedTest
@MethodSource("testCases")
void sumOfDigitsRecursionTest(final int expected, final int input) {
Assertions.assertEquals(expected, SumOfDigits.sumOfDigitsRecursion(input));
}

@Test
void testPositive() {
assertEquals(15, SumOfDigits.sumOfDigits(12345));
assertEquals(15, SumOfDigits.sumOfDigitsRecursion(12345));
assertEquals(15, SumOfDigits.sumOfDigitsFast(12345));
@ParameterizedTest
@MethodSource("testCases")
void sumOfDigitsFastTest(final int expected, final int input) {
Assertions.assertEquals(expected, SumOfDigits.sumOfDigitsFast(input));
}

@Test
void testNegative() {
assertEquals(6, SumOfDigits.sumOfDigits(-123));
assertEquals(6, SumOfDigits.sumOfDigitsRecursion(-123));
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));
}
}