Напишите код на любом языке программирования находящий сумму цифр числа.

Задача нахождения суммы цифр числа — классический пример работы с целочисленным делением и остатком от деления.

Нужно взять число, по очереди выделить его цифры и сложить их.

Идея алгоритма

Для целого положительного числа:

  1. Взять последнюю цифру как остаток от деления на 10.
  2. Добавить эту цифру к сумме.
  3. Удалить последнюю цифру целочисленным делением на 10.
  4. Повторять, пока число не станет равно 0.

Например, для числа 527:

527 % 10 = 7, сумма = 7
52  % 10 = 2, сумма = 9
5   % 10 = 5, сумма = 14

Ответ: 14.

Код на TypeScript

function sumDigits(value) {
  let number = Math.abs(Math.trunc(value));
  let sum = 0;

  while (number > 0) {
    sum += number % 10;
    number = Math.trunc(number / 10);
  }

  return sum;
}

console.log(sumDigits(527)); // 14
console.log(sumDigits(-308)); // 11
function sumDigits(value: number): number {
  let number = Math.abs(Math.trunc(value));
  let sum = 0;

  while (number > 0) {
    sum += number % 10;
    number = Math.trunc(number / 10);
  }

  return sum;
}

console.log(sumDigits(527)); // 14
console.log(sumDigits(-308)); // 11
package main
import "fmt"
func sumDigits(value int) int {
  if value < 0 {
    value = -value
  }

  sum := 0

  for value > 0 {
    sum += value % 10
    value /= 10
  }

  return sum
}

func main() {
  fmt.Println(sumDigits(527)) // 14
  fmt.Println(sumDigits(-308)) // 11
}
public class Example {
  static int sumDigits(int value) {
    int number = Math.abs(value);
    int sum = 0;

    while (number > 0) {
      sum += number % 10;
      number /= 10;
    }

    return sum;
  }

  public static void main(String[] args) {
    System.out.println(sumDigits(527)); // 14
    System.out.println(sumDigits(-308)); // 11
  }
}
def sum_digits(value):
  number = abs(value)
  total = 0

  while number > 0:
    total += number % 10
    number //= 10

  return total

print(sum_digits(527)) # 14
print(sum_digits(-308)) # 11

Почему используется модуль числа

Если число отрицательное, знак не должен влиять на сумму цифр. Поэтому сначала берется модуль числа.

Например, сумма цифр -308 равна 3 + 0 + 8 = 11.

Что будет с нулем

Для числа 0 сумма цифр равна 0. В приведенной реализации цикл не выполнится, и функция вернет начальное значение sum, то есть 0.

Вариант через строку

Можно решить задачу через преобразование числа в строку.

function sumDigitsAsString(value) {
  return Math.abs(Math.trunc(value))
    .toString()
    .split("")
    .reduce((sum, digit) => sum + Number(digit), 0);
}
function sumDigitsAsString(value: number): number {
  return Math.abs(Math.trunc(value))
    .toString()
    .split("")
    .reduce((sum, digit) => sum + Number(digit), 0);
}
package main
import (
  "strconv"
  "strings"
)
func sumDigitsAsString(value int) int {
  if value < 0 {
    value = -value
  }

  digits := strings.Split(strconv.Itoa(value), "")
  sum := 0

  for _, digit := range digits {
    number, _ := strconv.Atoi(digit)
    sum += number
  }

  return sum
}
public class Example {
  static int sumDigitsAsString(int value) {
    return String.valueOf(Math.abs(value))
      .chars()
      .map(Character::getNumericValue)
      .sum();
  }
}
def sum_digits_as_string(value):
  return sum(int(digit) for digit in str(abs(value)))

Такой вариант часто короче, но для изучения алгоритмов полезнее понимать арифметический способ.

Сложность

Если в числе k цифр, алгоритм выполняет k шагов.

Сложность по времени: O(k).

Сложность по памяти для арифметического варианта: O(1).

Типичные ошибки

Вывод

сумма цифр числа находится последовательным выделением последней цифры через остаток от деления на 10 и удалением этой цифры целочисленным делением на 10.

Источники

  • Семакин И.Г. Основы программирования и баз данных. Учебник. - М.: Академия, 2014. - 224 с.
  • Симонова Е.В. Структуры данных в C#. Линейные и нелинейные динамические структуры. - Лань, 2018. - 152 с.
  • Бертран Мейер. Почувствуй класс. Учимся программировать хорошо с объектами и контрактами. - М.: Национальный Открытый Университет "ИНТУИТ": БИНОМ. Лаборатория знаний, 2011. - 775 с.
  • Мэтт Вайсфельд. Объектно-ориентированное мышление. - СПб.: Питер, 2014. - 304 с.
  • Ривест Р., Штайн К., Лейзерсон Ч., Кормен Т. Алгоритмы: построение и анализ. - М.: Вильямс, 2007. - 1296 с.
  • Стивенс Род. Алгоритмы. Теория и практическое применение. - М.: Эксмо, 2017. - 544 с.
  • Рублев В.С. Основы теории алгоритмов. - 2-е издание, исправленное. - М.: Научный мир, 2008. - 128 с.
  • Гольдберг Г.Л. Основы алгоритмизации и программирования. - М.: Академия, 2012. - 384 с.
  • Лаврищева И.В. Технология программирования. - М.: Горячая линия - Телеком, 2011. - 400 с.
  • Сергеев И.С., Сухоруков А.И., Шестаков А.А. Программирование: учебник для вузов. - М.: БИНОМ. Лаборатория знаний, 2013. - 512 с.