Как итеративно вычислить сумму цифр в числе - java / bluej - PullRequest
0 голосов
/ 06 мая 2019

Я создаю два метода - один, который вычисляет сумму цифр числа рекурсивно, а другой - итеративно.

Я создал рекурсивный метод, и по большей части я понимаю концепцию нахождения суммы цифр, но я не уверен, как правильно поместить ее в итеративный метод. Мой код не дает мне правильный вывод.

  public static int iterativeDigitSum(long n) {
        if(n < 0){ 
           String err = "n must be positive. n = " + n;
         throw new IllegalArgumentException(err);
       }
     if(n == 0){
           return 0;
       }

        long sum = 0;
        long i = 0;
     while(n > 0){
             i = n % 10;
             sum = sum + n;
             n = n / 10;
       }
       int inSum = (int)sum;
       return inSum;
}

Число «n» равно 10, что означает ожидаемый результат 1. Я получаю 11. Не могли бы вы объяснить мне, что я делаю неправильно, и, возможно, как это исправить? Огромное спасибо.

1 Ответ

0 голосов
/ 03 июня 2019

По сути, алгоритм состоит из трех шагов:

  1. Получите крайнюю правую цифру числа. Поскольку каждая цифра в номере имеет ранг единиц, десятков, сотен, тысяч и т. Д. В зависимости от ее положения, крайняя правая цифра - остаток от деления числа на 10:

    digit = n % 10

  2. Суммируйте цифру:

    sum += digit

  3. Переместите все цифры на одну позицию вправо, разделив число на 10. Число становится в 10 раз меньше:

    n = n / 10

    По сути, это «предоставит» следующую правую цифру для шага 1.

Три вышеупомянутых шага повторяются до тех пор, пока значение числа не станет равным нулю.

Вы можете помочь себе визуализировать приведенное выше объяснение, добавив некоторую «отладочную» информацию в свой код:

public static int iterativeDigitSum(long n)
{
    long sum = 0;
    int i = 1;
    System.out.println("i\tn\tdigit\tsum");        
    while(n > 0) {
        long digit = n % 10;
        sum += digit;            
        System.out.println(i + "\t" + n + "\t" + digit + "\t" + sum);
        n = n / 10;
        i++;
    }
    System.out.println("\t" + n + "\t\t" + sum);
    return (int)sum;
}

Обратите внимание, что переменная i используется для подсчета итераций цикла, а переменная digit содержит самую правую цифру числа в каждой итерации.

Учитывая число 10, вывод на консоль BlueJ:

i   n     digit   sum
1   10    0       0
2   1     1       1
    0             1

и для номера 2019:

i   n       digit   sum
1   2019    9       9
2   201     1       10
3   20      0       10
4   2       2       12
    0               12

Надеюсь, это поможет.

...