алгоритм поиска чисел Армстронга выдает ошибку

Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу (например, 153). Получить все числа Армстронга, меньшие n(в n до 4 цифр)

var n;
function armstrong(n) {
    var i, j, low, lst, rest, sum, tmp, upp;
    lst = [];
    for (i = 1; i <= n; i += 1) {
        low = Math.pow(10, (i - 1));
        upp = Math.pow(10, i);
        for (j = low; j < upp; j += 1) {
            tmp = j;
            sum = 0;
            while (j > 0) {
                rest = (j % 10);
                sum += Math.pow(rest, i);
                j = (j - rest) / 10;
            }
            if (sum == tmp) {
                lst.push(tmp);
            }
        }
    }
    return lst;
}
n = 1;
console.log(armstrong(n));

выдаёт heap out of memory

если закомментировать некоторые строки:

var n;
function armstrong(n) {
    var i, j, low, lst, rest, sum, tmp, upp;
    lst = [];
    for (i = 1; i <= n; i += 1) {
        low = Math.pow(10, (i - 1));
        upp = Math.pow(10, i);
        for (j = low; j < upp; j += 1) {
            tmp = j;
            sum = 0;
            //while (j > 0) {
                rest = (j % 10);
                sum += Math.pow(rest, i);
                //j = (j - rest) / 10;
            //}
            if (sum == tmp) {
                lst.push(tmp);
            }
        }
    }
    return lst;
}
n = 1;
console.log(armstrong(n));

выдаёт массив чисел до 10ти


Ответы (3 шт):

Автор решения: Igor

function armstrong(num) {
    const lst = [];
    for (let i = 1; i <= num; i++) {
      const digits = (i + '').split('');
      const sum = digits.reduce((a, i) => a + Math.pow(i, digits.length), 0);
      if (sum == i)
        lst.push(i);
    }
    return lst;
}
console.log(armstrong(9999));

→ Ссылка
Автор решения: entithat

let armstrong = n => [...Array(n + 1)].map((_, i) => i + 1).filter(e => [...'' + e].reduce((a, c) => a + c ** ('' + e).length, 0) == e);

console.log(armstrong(10));
console.log(armstrong(9999));

→ Ссылка
Автор решения: user465677

Для примера код на питоне, который РАБОТАЕТ, а на js так не выходит, хотя логика та же

def armstrong(n):
    lst=[]
    for i in range(1,n+1):
        low=10**(i-1)
        upp=10**i
        for j in range(low,upp):
            tmp=j
            sum=0
            while j > 0:
                rest=j%10
                sum+=rest**i
                j//=10
            if sum == tmp:
                lst.append(tmp)
    return lst

print(armstrong(4))

функция по условию должна использовать только формулы, никаких split и т д. n - количество цифр в числе, от которого и пляшет вся программа если вызываем функцию от n=3, то функция возвращает массив числе Армстронга до 999 включительно в самом вопросе мой код, я просто не могу разобраться в его работе. попытка добавить лишнее условие и поставить break - успехом не увенчалась

→ Ссылка