Javascript как найти сумму цифр числа

I am newbie.

I want to make small app which will calculate the sum of all the digits of a number.

For example, if I have the number 2568, the app will calculate 2+5+6+8 which is equal with 21. Finally, it will calculate the sum of 21’s digits and the final result will be 3 .

Please help me

asked Jul 12, 2016 at 16:40

Hodorogea Alexandru's user avatar

4

Basically you have two methods to get the sum of all parts of an integer number.

  • With numerical operations

    Take the number and build the remainder of ten and add that. Then take the integer part of the division of the number by 10. Proceed.

var value = 2568,
    sum = 0;

while (value) {
    sum += value % 10;
    value = Math.floor(value / 10);
}

console.log(sum);
  • Use string operations

    Convert the number to string, split the string and get an array with all digits and perform a reduce for every part and return the sum.

var value = 2568,
    sum = value
        .toString()
        .split('')
        .map(Number)
        .reduce(function (a, b) {
            return a + b;
        }, 0);

console.log(sum);

For returning the value, you need to addres the value property.

rezultat.value = sum;
//      ^^^^^^
function sumDigits() {
    var value = document.getElementById("thenumber").value,
        sum = 0;

  while (value) {
      sum += value % 10;
      value = Math.floor(value / 10);
  }
  
  var rezultat = document.getElementById("result");
  rezultat.value = sum;
}
<input type="text" placeholder="number" id="thenumber"/><br/><br/>
<button onclick="sumDigits()">Calculate</button><br/><br/>
<input type="text" readonly="true" placeholder="the result" id="result"/>

Community's user avatar

answered Jul 12, 2016 at 18:21

Nina Scholz's user avatar

Nina ScholzNina Scholz

374k25 gold badges344 silver badges386 bronze badges

7

How about this simple approach using modulo 9 arithmetic?

function sumDigits(n) {
  return (n - 1) % 9 + 1;
}

answered Nov 25, 2017 at 13:07

fethe's user avatar

14

With mathy formula:

function sumDigits(n) { 
    return (--n % 9) + 1;
}

Without mathy formula:

function sumDigits(n) {
    if (typeof n !== 'string') {
        n = n.toString();
    }    
    if (n.length < 2) {
        return parseInt(n);
    }
​
    return sumDigits(
        n.split('')
         .reduce((acc, num) => acc += parseInt(num), 0)
    );
}

answered Apr 26, 2021 at 15:42

WesleyAC's user avatar

WesleyACWesleyAC

5246 silver badges11 bronze badges

let’s try recursivity

function sumDigits(n) {
  if (n < 10) return n
  return sumDigits(n % 10 + sumDigits(Math.floor(n / 10)))
}

sumDigits(2) // 2
sumDigits(2568) // 3

answered Jun 12, 2020 at 20:12

Envy Hion's user avatar

Envy HionEnvy Hion

1841 silver badge8 bronze badges

The sum of digits can be calculated using that function (based on other answers):

function sumDigits(n) {
    let sum = 0;
    while (n) {
        digit = n % 10;
        sum += digit;
        n = (n - digit) / 10;
    }
    return sum;
}

If you really need to sum the digits recursively there is recursive version of the function:

function sumDigitsRecursively(n) {
    let sum = sumDigits(n);
    if (sum < 10)
        return sum;
    else
        return sumDigitsRecursively(sum);
}

The sumDigitsRecursively(2568) expression will be equal to 3. Because 2+5+6+8 = 21 and 2+1 = 3.

Note that recursive solution by @FedericoAntonucci should be more efficient, but it does not give you intermediate sum of digits if you need it.

answered May 30, 2020 at 10:32

Konard's user avatar

KonardKonard

2,19827 silver badges21 bronze badges

5

You could do it this way.

function sums(input) {
    let numArr = input.toString().split('');
    let sum = numArr.reduce((a, b) => Number(a) + Number(b));
    return sum < 10 ? sum : sums(sum);
}

Valor_'s user avatar

Valor_

3,4219 gold badges59 silver badges108 bronze badges

answered Aug 26, 2021 at 4:35

Ankush Tiwari's user avatar

1

Expanding upon @fethe ‘s answer, this sumOfDigit function is able to handle large number or BigInt

function sumOfDigits(n) { 
  return (Number.isSafeInteger(n)) ? (--n % 9) + 1 : Number((--n % 9n) + 1n);
}

console.log(sumOfDigits(101)); // 2
console.log(sumOfDigits(84932)); // 8
console.log(sumOfDigits(900000000000000000000000009n)); // 9

answered Jul 30, 2021 at 4:43

yogski's user avatar

yogskiyogski

1711 silver badge10 bronze badges

you can use this function and pass your number to it:

const solution = (n) => {
    const arr = `${n}`
    let sum = 0;
    for (let index = 0; index < arr.length; index++) {
        sum += parseInt(arr[index])
    }
    return sum;
}

answered Jan 30 at 17:19

Dawood Valeed's user avatar

Дается функция:
function digitSum(n) {} где «n» любое целое число от 0 до бесконечности.

Только только обучаюсь JS. Дошел только до этого:

var reg = /d/g;
return +(n.match(reg));

Но не могу понять, числа который возвращаются это строка или массив? Что делать потом? Использовать reduce?
Дайте истинный путь, пожалуйста. Или может быть последовательность рассуждений. Или я, впринципе, в корне неправильно действую? Ответ не надо :) Хочу подразобраться сам.

2 ответа

function fSumAllDigits(n) {
  return [...n.toString()].reduce((acc, el) => acc + parseInt(el), 0);
}
console.log( fSumAllDigits(111) ); // 3
console.log( fSumAllDigits('123') ); // 6
console.log( fSumAllDigits(700000001) ); // 8

ответ дан 7 ноя 2021 в 14:38

UModeL's user avatar

UModeLUModeL

32.4k6 золотых знаков28 серебряных знаков68 бронзовых знаков

2

  • [...''+n] :) acc+ +el :))

    7 ноя 2021 в 14:51

  • @entithat, скорее Array.from(n.toString).reduce... или n.toString().split('').reduce... ))

    7 ноя 2021 в 15:44

let x = 0;
for (let i = 0; i < num.length; i++) {
  x = x + Number(num[i]);
}
console.log(`Сумма всех цифр числа: ${x}`);

ответ дан 7 ноя 2021 в 14:44

2

  • Почему не x += Number(num[i])?

    7 ноя 2021 в 19:27

  • @OliverPatterson «Потому что потому.» Владимир Путин

    – user176262

    7 ноя 2021 в 20:21

Старый

17.01.2017, 14:19

Кандидат Javascript-наук

Отправить личное сообщение для yaparoff

Посмотреть профиль

Найти все сообщения от yaparoff

 

Регистрация: 26.04.2016

Сообщений: 106

Найти сумму цифр числа

Есть число 2017, как найти сумму его цифр?

Ответить с цитированием

Старый

17.01.2017, 14:35

Аватар для ksa

CacheVar

Отправить личное сообщение для ksa

Посмотреть профиль

Найти все сообщения от ksa

 

Регистрация: 19.08.2010

Сообщений: 14,056

Есть число 2017, как найти сумму его цифр?

Пройтис в цикле по его символам… Преобразовать символ в натуральное число… Суммировать те числа.

Ответить с цитированием

Старый

17.01.2017, 15:16

Кандидат Javascript-наук

Отправить личное сообщение для yaparoff

Посмотреть профиль

Найти все сообщения от yaparoff

 

Регистрация: 26.04.2016

Сообщений: 106

Сообщение от ksa

Пройтис в цикле по его символам

Вот именно это и интересует. Как разбить число по символам?
Например, вот так сработает:

'2017'.split('');

— выводиться: 2,0,1,7
А если это делать в функции?

function getNumbersSum(num){
  var result = 'num'.split('');
  alert(result);
}
getNumbersSum(2017);

тогда выводиться: n,u,m — и нет никаких чисел

Ответить с цитированием

Старый

17.01.2017, 15:19

Профессор

Отправить личное сообщение для laimas

Посмотреть профиль

Найти все сообщения от laimas

 

Регистрация: 14.01.2015

Сообщений: 12,990

function getNumbersSum(num){
     return num.toString().split('').reduce(function(a, b) {
         return +a + +b;
     })
}

Ответить с цитированием

Старый

17.01.2017, 15:32

Аватар для ksa

CacheVar

Отправить личное сообщение для ksa

Посмотреть профиль

Найти все сообщения от ksa

 

Регистрация: 19.08.2010

Сообщений: 14,056

Сообщение от yaparoff

А если это делать в функции?

Например так…

var n=12345;
alert((''+n).split(''));

Ответить с цитированием

Старый

17.01.2017, 22:54

function getSumNumber(num) {
    var sum = 0, tmp;
    while (num) {
        tmp = num % 10;
        num = (num - tmp) / 10;
        sum += tmp;
    }
    return sum;
}

alert(getSumNumber(2610));

вариант без использования преобразований

Ответить с цитированием

Старый

02.01.2021, 18:32

Новичок на форуме

Отправить личное сообщение для anwebsik

Посмотреть профиль

Найти все сообщения от anwebsik

 

Регистрация: 02.01.2021

Сообщений: 1

Вот ответ фенкцией.

function digitSum(y) {
    let sum = 0, x = String(y);
    
    for (let i = 0; i < x.length; i++) {
        sum += Number(x[i]);
    }
    return(sum)
}

// if alert(digitSum(123)), output is 6.

Ответить с цитированием

s3lfstyle

0 / 0 / 0

Регистрация: 27.05.2015

Сообщений: 72

1

Найти сумму цифр в числе

09.06.2015, 21:43. Показов 41464. Ответов 22

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Javascript
1
2
3
4
5
6
7
8
9
10
var a = prompt("Введите число","");
var b = 0;
if(a == 0) {
    alert("Сумма чисел равна 0");
}
for(var i = a; i > 0; i/10) {
        b += a%b;
    }
}
alert(b);

Только начал учить JS, почему не работает данный код?



0



Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 22:30

2

)))
синтаксис
вы в 9 строке лишнюю скобку поставили
учите, учите



0



buxtom

-13 / 16 / 8

Регистрация: 20.04.2015

Сообщений: 62

09.06.2015, 22:30

3

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var strNum = prompt("Введите число", "");
var result = 0;
 
// Простой вариант, если число в виде строки
for (var i = 0; i < strNum.length; i++)
  result += Number(strNum[i]);
 
console.log(result);
  
// Вариант с числами
var nums = prompt("Введите число", "");
var length = nums.length;      // Количество цифр
nums = Number(nums);           // Переводим строку в число
 
var temp = 0;                  // Для хранения цифр
var result = 0;                // Конечный результат
 
for (var i = 0; i < length; i++) {
  temp = nums % 10;            // Сохраняем цифру в переменной
  result += temp;              // Складываем цифры числа
  nums = parseInt(nums /10);   // Переходим к следующей цифре в числе
}
  
 
console.log(result);



0



Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 22:35

4

s3lfstyle, и действительно, на работоспособность ваш код даже и не стал проверять, а зря



0



s3lfstyle

0 / 0 / 0

Регистрация: 27.05.2015

Сообщений: 72

09.06.2015, 22:47

 [ТС]

5

Javascript
1
2
3
4
5
6
7
8
9
10
var a = prompt("Введите число","");
var b = 0;
if(+a == 0) {
    alert("Сумма чисел равна 0");
}
for(var i = +a; i > 0; i = i/10) {
        b += +a%10;
    }
 
alert(b);

Почему мне возвращается 1968?
Код ведь правильный.



0



Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 22:51

6

у меня тоже хрень возвращается

а вот этот работает

Цитата
Сообщение от buxtom
Посмотреть сообщение

var strNum = prompt(«Введите число», «»);
var result = 0;
// Простой вариант, если число в виде строки
for (var i = 0; i < strNum.length; i++)
* result += Number(strNum[i]);
console.log(result);
// Вариант с числами
var nums = prompt(«Введите число», «»);
var length = nums.length; * * *// Количество цифр
nums = Number(nums); * * * * * // Переводим строку в число
var temp = 0; * * * * * * * * *// Для хранения цифр
var result = 0; * * * * * * * *// Конечный результат
for (var i = 0; i < length; i++) {
* temp = nums % 10; * * * * * *// Сохраняем цифру в переменной
* result += temp; * * * * * * *// Складываем цифры числа
* nums = parseInt(nums /10); * // Переходим к следующей цифре в числе
}
console.log(result);

Добавлено через 1 минуту
s3lfstyle, ваш код к сожалению не правильный
ну во первых вы не перебираете всю строку
во-вторых вы зачем-то берёте остаток



0



0 / 0 / 0

Регистрация: 27.05.2015

Сообщений: 72

09.06.2015, 22:53

 [ТС]

7

А почему?
В чём причина?

Добавлено через 1 минуту
Я принимаю строку, проверяю не равно ли число a нулю, затем в цикле for складываю последние цифры числа при этом «удаляя» последнюю цифру из числа.



0



Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 22:53

8

s3lfstyle, понял почему берёте остаток
но всё равно не перебираете строку
а вообще buxtom вам дал готовое рабочее решение



0



0 / 0 / 0

Регистрация: 27.05.2015

Сообщений: 72

09.06.2015, 22:55

 [ТС]

9

В его решении миллион строк, я просто не могу понять, почему моё решение не работает? Я вообще не вижу в своём решении ошибок. Зачем мне перебирать строку, если я перевожу эту строку в число?



0



buxtom

-13 / 16 / 8

Регистрация: 20.04.2015

Сообщений: 62

09.06.2015, 22:56

10

1. проблема в вашем коде в том, что операция деления в JavaScript при делении целого на целое автоматически не отбрасывает дробную часть, т. е. как минимум вы должны явно приводить к целому числу отбрасывая дробную часть

2. в строке:

Javascript
1
b += +a%10

вы используете переменную, значение которой не изменяется…, чтобы именно ваш код работал, можете переделать его по такому виду:

Javascript
1
2
3
4
5
6
7
8
9
10
var a = prompt("Введите число","");
var b = 0;
if(+a == 0) {
    alert("Сумма чисел равна 0");
}
for(var i = +a; i > 0; i = parseInt(i/10)) {
        b += +i%10;
    }
 
alert(b);



0



Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 22:57

11

ну потому что for у вас просто перебирает строку, что вообще-то нельзя делать вот таким способом



0



0 / 0 / 0

Регистрация: 27.05.2015

Сообщений: 72

09.06.2015, 22:59

 [ТС]

12

Это из-за динамической типизации?
Я понял, просто в языках со строгой типизацией int целочисленное и записывается без дробной части.

Добавлено через 54 секунды
А здесь получается у меня после i = i/10 число не «отбрасывает» последнее число, а становится с плавающей точкой.



0



BANO

Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 23:00

13

вот вам хард кор

Javascript
1
2
3
4
5
res=0
s=prompt("");
s= [].slice.call(s);
s.forEach(function(i){res+=(+i)});
alert(res);

Добавлено через 27 секунд
хотя врое проще чем ваши всякие там for



1



0 / 0 / 0

Регистрация: 27.05.2015

Сообщений: 72

09.06.2015, 23:01

 [ТС]

14

Не понял 90% вашего кода, рановато мне пока такое.



0



Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 23:04

15

s3lfstyle, нету тут челочисленных
тут просто числа с плавающей запятой
тут и не надо собственно говоря тип переменной определять она может в себе хранить всё что угодно

а вот такой код не должен воспринимать никакие запятые и буквы, он их должен просто отвергать

Добавлено через 35 секунд
s3lfstyle, я знаю, это хард кор

Добавлено через 23 секунды
и насколько я помню он и не примет



0



0 / 0 / 0

Регистрация: 27.05.2015

Сообщений: 72

09.06.2015, 23:04

 [ТС]

16

Немного не могу понять parseInt(), в чём его задача?



0



BANO

Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 23:06

17

а вот фиг

как только появляется не число он nan выдаёт
надо изменить

вот вам нормальный код

Javascript
1
2
3
4
5
res=0
s=prompt("");
s= [].slice.call(s);
s.forEach(function(i){res+=(+i)||0});
alert(res);



0



-13 / 16 / 8

Регистрация: 20.04.2015

Сообщений: 62

09.06.2015, 23:07

18

Цитата
Сообщение от s3lfstyle
Посмотреть сообщение

Немного не могу понять parseInt(), в чём его задача?

например здесь можно прочитать, как работает эта функция



0



BANO

Ренегат

Эксперт HTML/CSS

1740 / 1085 / 386

Регистрация: 06.08.2014

Сообщений: 5,203

Записей в блоге: 1

09.06.2015, 23:12

19

а теперь давайте разясню))

Добавлено через 4 минуты

Javascript
1
2
3
4
5
6
7
res=0
s=prompt("");
s= [].slice.call(s);// превращение строки в массив
s.forEach(function(i){// функция перебора массива
res+=(+i)||0// тут логика такая, приплюсовываем либо число, а если это было не число(то есть parseInt вернул NaN) то приплюсовать 0(ну просто мне нехочется использовать if...else и решил использовать сокращённую форму)
});
alert(res);

это перебор массива
а вот с превращением строки в массив — это хак js
как и сокращённый if else



0



kalabuni

супермизантроп

Эксперт JS

3938 / 2976 / 692

Регистрация: 18.04.2012

Сообщений: 8,625

09.06.2015, 23:28

20

buxtom, ваш код неправильный
уже после первого шага цикла переменная a в 9-ти случаях из 10-ти у вас станет числом с дробной частью

Javascript
1
2
3
4
5
6
7
8
function SoN ()
{
var a = prompt('Введите натуральное число', '');
if (isNaN (a)) {if (confirm ('Вы ввели вообще не числоnПопробуете снова?')) SoN ()}
else if (a != parseInt (Math.abs (a))) {if (confirm ('Вы ввели не натуральное числоnПопробуете снова?')) SoN ()}
else {for (var s = a, b = 0; +a > 0; b += a % 10, a = Math.floor (a / 10)); alert(' Сумма цифр числа ' + s + ' равна ' + b)}
}
SoN ();



0



Понравилась статья? Поделить с друзьями:
  • Как найти квадрат расстояния между прямыми
  • Как найти синус 630 градусов
  • Как в паскале найти сумму массива нечетных
  • Ошибка другой пользователь уже установил несовместимую версию этого приложения как исправить андроид
  • Как найти сторону пирамиды зная боковое ребро