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;
    }

    /**
     * Calculate the sum of digits of a number
     *
     * @param number the number contains digits
     * @return sum of digits of given {@code number}
     */
    public static int sumOfDigits(int number) {
        number = number < 0 ? -number : number;
        /* calculate abs value */
        int sum = 0;
        while (number != 0) {
            sum += number % 10;
            number /= 10;
        }
        return sum;
    }

    /**
     * Calculate the sum of digits of a number using recursion
     *
     * @param number the number contains digits
     * @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);
    }

    /**
     * Calculate the sum of digits of a number using char array
     *
     * @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;
    }
}
