Задача с codewars JS
Есть условие задачи: Given n, take the sum of the digits of n. If that value has more than one digit, continue reducing in this way until a single-digit number is produced. The input will be a non-negative integer.
Вот мой код, но программа пишет что код неверен, хотя в VSC у меня все работает. Подскажите пожалуйста, что я делаю не так?
function digital_root(n) {
let result = n.toString(10).split('').map(Number);
res = result.reduce((sum, item) => {
return sum + item
})
if (res < 10) {
return res
} else if (res / 10 < 10) {
res = res.toString(10).split('').map(Number).reduce((sum, item) => {
return sum + item
})
}
}
Ответы (3 шт):
const solve = (n) => {
while (n > 9) {
n = n.toString(10).split('').map(Number).reduce((acc, num) => {
return acc + num;
}, 0);
}
return n;
};
console.log(solve(1234));
console.log(solve(555));
console.log(solve(1));
console.log(solve(1058962));
Для решения достаточно вычислить остаток по модулю 9
m = n%9
if (m)
return m
if (n)
return 9
return 0
а вот эти все число-в-строку, строку-в-число, мапредусы - только планету зря греть.
В принципе логика правильная, только есть пару нюансов. Первый - это неправильные условия (особенно в блоке else if (res >= 10) - мы должны сделать проверку - "ещё если res больше или равно 10", в первом if так же советую поправить на res < 9, чтобы не допустить пересечения одинаковых проверок чисел больше 10). Второй нюанс - это нужно явно вернуть значение в блоке else if. И вуаля, всё заработает.)
function digital_root(n) {
let result = n.toString(10).split('').map(Number);
res = result.reduce((sum, item) => {
return sum + item
})
if (res < 9) {
return res
} else if (res >= 10) {
return res = res.toString(10).split('').map(Number).reduce((sum, item) => {
return sum + item
})
}
}