Счастливое число-это то число, в результате последовательного сложения квадратов цифр которой, при какой-то итерации получается 1.
На пример число 23 счастливое число, потому-что:
Таким образом, в результате трех шагов мы получили 1, что подтверждает, что 23 это счастливое число. Необходимо разработать функцию, которая получает число и возвращает true, если данное число счастливая и false в противном случае.
Заметим, что для определения счастливых чисел на каждом шагу получается какое-то число (в нашем примере 13,10,1). если число не счастливая, то в числах встречаются повторяющиеся цифры.
задачу нужно решить под 4 варианта:
на входе:23 на выходе: true
на входе:44 на выходе: true
на входе:10 на выходе: true
на входе:28 на выходе: true
ещё есть подсказка:
при поиске счастливых чисел на каждом шагу получается определенное ‘y’ число, цифры которой нужно попытаться сложить. Если число не счастливая, то число ‘y’ может повториться в каком-то i шаге. Следовательно, если число ‘y’ встречается более одного раза внутри цикла, необходимо вернуть false
вот моя попытка реализовать код
function solution(x) {
let s = 0
for (let i = 0; i < x.length; i++) {
x = x.split('').map(a => a * a)
s += x[i] + x[i + 1]
return s //результатом получается 13 после чего хочу сделать 1*1+3*3, но тщетно
}
}
x скорее всего строка, тогда x[i] тоже строка. Да, x[i] содержит численный символ, но он все все равно считается строкой. С точки зрения типов тут x[i] + x[i+1] происходит конкатенация строк. Поэтому получается 13.
Тебе нужно привести строковые значения к числовым чтобы получить результат сложения чисел. Например так:
В результате split получается массив строк. Операция умножения работатет только с числами. Тебе снова нужно преобразовать строки в числа перед тем как их умножать.
function solution(x) {
let foo = '';
while (x > 9) {
let arr = []
arr = x.toString().split('');
let result = 0;
for (let i = 0; i < arr.length; i++) {
result += Number(arr[i]) * Number(arr[i]);
}
if (foo.length > 0) {
let duck = [];
duck = foo.split('');
for (let i = 0; i < duck.lenght; i++) {
if (result == Number(duck[i])) {
return false;
}
}
}
foo += result;
x = result;
return x == 1;
}
}
console.log(solution(44))
и так тоже пытался: x.toString().split('').map(a=>a * a).reduce((a,b)=>a+b)
всё же не получилось решить задачку, можешь помочь?
Программирование во многом - разбивание задачи на части и потом сочетание этих частей вместе. Части должны быть желательно незавимимыми.
В этой задаче есть явно выделяемая часть - поиск суммы квадратов цифр. Напиши отдельную функцию, которая получает на вход число, и возвращает сумму квадратов цифр.
function getNumSquaresSum(num) {
}
Допустим она есть, тогда алгоритм выглядит так:
function isLucky(num) {
let occuredNumbers = {} // тут будем запоминать повторяющиеся суммы квадратов цифр
while (true) { // Бесконечный цикл. Условие выхода из цикла прописаны в теле самого цикла как return
let sum = getNumSquaresSum(num)
if (sum === 1) {
return true
} else {
// на какой-то итерации в occuredNumbers[sum] уже было записано значение суммы
// квадратов цифр, значит число - "несчастливое"
if (occuredNumbers[sum]) {
return false
}
occuredNumbers[sum] = true
num = sum
}
}
}
Я отформатировал твой пост и комментарий на который отвечаю. Посмотри на будущее во что оборачивать код чтобы он красиво подсвечивался на страницах (как блочный так и инлайновый) Как формулировать вопрос, подсвечивать код, благодарить