Дано трехзначное число найдите сумму его цифр javascript

Как найти сумму цифр многозначного числа рекурсией? [закрыт]

Учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи. Например, приведите код, который вы написали, пытаясь решить задачу

Задача: написать функцию, аргументом которой является число(может быть как дробным так и целым), а результатом — сумма всех цифр

сal(123) = 1+2+3 = 6 cal(123.45) = 1+2+3+4+5 = 15 

Загвоздка в том что нельзя использовать никаких методов, циклов. Только рекурсия. Может есть кто знает решение?

Да, конечно. Аргументом является число(может быть как дробным так и целым), при запуске функции должно вернуть сумму всех чисел(сal(123) = 1+2+3), условием решения является то что нельзя использовать никаких методов и циклов(for, reduce и все что есть в js и вызывается с помощью ()).

3 ответа 3

А ларчик просто открывался.

console.log(cal(123.45)) console.log(cal()) console.log(cal('abcd')) console.log(cal('abcd123.45')) function cal(value, index=0) < var result = 0; var value_text = value + ""; //преобразуем в строку var skip = index === value_text.length; //признак пропуска вычислений var digit_text = skip? "." : value_text[index]; //очередная цифра в виде строки index += 1; //result += digit_text >= '0' && digit_text 

для вызова рекурсии все равно использованы скобки.

let cal = a => < // преобразуем входной аргумент в массив символов если это число a = a >0 ? [. a + ''] : a; // приводим к числу последний символ массива или берем 0 если символ не приводится к числу let b = + a[a.length - 1] || 0; // складываем число с результатом вызова этой же функции, // но уже с массивом без последнего символа, пока массив содержит символы return a ? b + cal(--a.length ? a : 0) : 0; > console.log(cal(123.45));

@SergeyNudnov 🙂 ну это не сложно добавить, но я почему-то не стал рассматривать такую возможность на ночь глядя. меня больше заинтересовало отсутствие скобок при вызове рекурсии..

Читайте также:  Random nextint method in java

У Вас более лаконичный код, хотя и не будет работать на IE из-за . . А вот с рекурсией. Жаль, что нету перезагрузки операторов.

@SergeyNudnov у меня такое ощущение что можно формально соблюсти оригинальное условие автора вообще не использовать скобки

@SergeyNudnov я еще подсократил код + было замечено что отрицательное число вернет 0, но в вопросе про это тоже ничего нет

Если задача именно в рекурсии, то могу предложить такой алгоритм:

Если входной параметр - 0, то вернуть 0. Если входной параметр - дробное число > 1, то результат = cal(целая часть)+cal(дробная часть). Если входной параметр - целое число, то результат = остаток от деления на 10 + cal(целая часть от деления на десять). Если входной параметр - дробное число от 0 до 1 (не включительно), то результат = целая часть от умножения на 10 + cal(дробная часть от умножения на десять). 

Источник

Sum all the digits of a number 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

If you treat the number as a string (‘2568’), then split the string on every character (str.split(»)), you will have every digit listed out separately in an array. Each digit is still a string, but you can then cast each to a number and add them up. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

8 Answers 8

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.

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

for the second solution «Use string operations» If I use the number 0123 instead of 2568 answer is wrong.

How about this simple approach using modulo 9 arithmetic?

note: it finds the sum of digits recursively (it is not clear from the title of the question and the accepted answer)

@AlexShevyakov ignore the -1 and +1, then it is just n%9. Since a number n=10^k*a_k + 10^(k-1)*a_(k-1). 10^0*a_0. Modulo 9 removes all all 10^i, since 10^i mod 9 = 1. Then the sum is created modulo 9 as well. When you imagine -1 shifts the whole number line by one to the left, you get also the nines correctly. After that you simply add 1 again.

@FedericoAntonucci Apparently it fails for all numbers greater than 10 which have remainder 1 on division with 9. For eg. 19, 28, 37, 46, . and so on. The function should return 10 for these cases but instead returns 1.

@R3l1c the function should return rhe sum recursively, that’s exactly what the question asks, read it again please. This solution works perfect for this question

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) ); > 
function sumDigits(n) < if (n < 10) return n return sumDigits(n % 10 + sumDigits(Math.floor(n / 10))) >sumDigits(2) // 2 sumDigits(2568) // 3 

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)

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.

@FedericoAntonucci but you didn’t name your function as sumDigitsRecursively and it did confised me, because I was looking for the method to just sumDigits. My answer contains solution that gives the same results as yours. Why did you voted my answer down?

I got here when I was looking for just the sum of digits of the number, and the accepted answer do not contain a function that just receives the number and returns the sum. So I made it. Accepted solution makes a call to Math.float , but there is no need to do so. So for my task this is a better solution. Also the recursive version is only a bit less efficient than yours (and I wrote about it in the answer), but it is easy to understand. On the other hand you didn’t explain how your solution work, and didn`t name it correctly so it caused the confusion for me and for @Raknos13.

I was just answering the question, it didn’t ask for what you are saying, you should read the whole question, not just the title

Источник

сумма цифр числа javascript

Я получаю правильный ответ, я просто не полностью понимаю 2-ю функцию, а именно оператор while. Любая помощь будет принята с благодарностью. Спасибо!

4 ответа

Вторая функция использует оператор по модулю для извлечения последней цифры:

 1236 % 10 = 1236 - 10 * floor(1236 / 10) = 1236 - 1230 = 6 

Когда последняя цифра извлекается, она вычитается из числа:

И это число делится на 10 :

Каждый раз, когда этот цикл повторяется, последняя цифра обрезается и добавляется к сумме.

Оператор по модулю возвращает одну цифру, если левая сторона меньше правой (что произойдет для любого 1-значного числа), то есть когда цикл прерывается:

Вот как начальная цифра добавляется к итогу.

Менее численная альтернатива будет такой:

function sumDigits(number) < var str = number.toString(); var sum = 0; for (var i = 0; i < str.length; i++) < sum += parseInt(str.charAt(i), 10); >return sum; > 

Он буквально выполняет то, что вы пытаетесь сделать, то есть перебираете цифры числа (преобразовывая его в строку).

var result = eval('123456'.replace(/(\d)(?=\d)/g, '$1+')); alert(result); // 21
var result = '123456'.split('').reduce(function(a,b)< return +a+ +b; >); alert(result); // 21

Не уверен, что вы имели в виду, в случае, если вы спрашивали о цикле while ..

Оператор while непрерывно выполняет блок операторов, в то время как определенное условие выполняется. Его синтаксис может быть выражен как:

Оператор while вычисляет выражение, которое должно возвращать логическое значение. Если выражение имеет значение true, оператор while выполняет оператор (ы) в блоке while. Оператор while продолжает тестировать выражение и выполнять его блок, пока выражение не станет ложным.

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

'123456'.split('').map(function(e)).reduce(function(a,b)); //21 

Обновление (синтаксис ES6):

[. '123456'].map(e=>parseInt(e)).reduce((a,b)=>a+b); //21 

Источник

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

как сделать?объясните(найти сумму цифр во введенном числе)
Создать документ, с формой, позволяющей найти сумму цифр, во введенном пользователем числе. я.

Найти сумму последних двух цифр числа
найти сумму последних двух цифр числа пример: вход 1234 выход 7 если тема не в том разделе.

Функция расположения цифр в числе в порядке убывания
Есть задачка по созданию функции, которая располагает цифры любого заданного целого положительного.

Эксперт HTML/CSS

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

Эксперт HTML/CSS

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

Эксперт HTML/CSS

ЦитатаСообщение от 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, ваш код к сожалению не правильный
ну во первых вы не перебираете всю строку
во-вторых вы зачем-то берёте остаток

Источник

Оцените статью