Попробуйте создать цикл for, который итеративно складывает сумму своих прогонов в общую переменную - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь написать функцию в Javascript, которая будет возвращать true или false в зависимости от того, является ли число числом Армстронга или нет. Числа Армстронга - это числа, которые берут каждую цифру числа и умножают ее на длину числа, а затем складывают их все до совпадения с исходным числом. Например: 153 - это число Армстронга, потому что: 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153.

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

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

const validate = (num) => {
  const numlength = num.toString().length;
  let armstrong;
  let singleDigit;
  for (i = 0; i < numlength; i++) {
    singleDigit = num.toString()[i] ** numlength;
    armstrong += singleDigit;
  }
  if (armstrong == num) {
    return true;
  } else {
    return false;
  }
};

console.log(validate(153))

Проблема, с которой я сталкиваюсь, заключается в том, что переменная armstrong по какой-то причине возвращает NaN. Я не совсем уверен, как итеративно добавлять значения singleDigit, найденные в операторе for. Когда я console.log(singleDigit) сразу после того, как это выяснилось в операторе for, значение будет правильным. Если я console.log(armstrong) сразу после этого, я получаю NaN

1 Ответ

2 голосов
/ 03 ноября 2019

Вам необходимо установить начальное значение armstrong = 0.

По умолчанию это undefined поэтому при выполнении математической операции с undefined это приводит к NaN

const validate = num => {
  let numString = num.toString()
  const numlength = numString.length;
  let armstrong = 0;
  let singleDigit = 0;
  for (let i = 0; i < numlength; i++) {
    singleDigit = numString[i] ** numlength;
    armstrong += singleDigit;
  }
  return armstrong == num
};

console.log(validate(153))

Примечание на стороне: -

  1. Вы можете простоудаляя последний оператор if else, armstrong == num уже приводит к true или false

  2. Вместо вызова toString() на каждой итерации мы можем просто сохранить переменную ииспользуйте его


Еще один способ - использовать уменьшение вместо цикла

const validate = num => {
  let numString = num.toString()
  const numLength = numString.length;
  const armstrong = [...numString].reduce((acc, r) => acc += r ** numLength, 0)
  return armstrong == num
};

console.log(validate(153))
...