По сути, алгоритм состоит из трех шагов:
Получите крайнюю правую цифру числа. Поскольку каждая цифра в номере имеет ранг единиц, десятков, сотен, тысяч и т. Д. В зависимости от ее положения, крайняя правая цифра - остаток от деления числа на 10:
digit = n % 10
Суммируйте цифру:
sum += digit
Переместите все цифры на одну позицию вправо, разделив число на 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
Надеюсь, это поможет.