Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция нахождения дружественных чисел в заданном интервале. (https://javascript.ru/forum/misc/83011-funkciya-nakhozhdeniya-druzhestvennykh-chisel-v-zadannom-intervale.html)

Gm5 26.08.2021 14:08

Функция нахождения дружественных чисел в заданном интервале.
 
Ребят, привет! Решаю задачи по написанию функций, но со следующей задачей зашёл в тупик.
Сделайте функцию getFreindly, которая будет находить пары дружественных чисел в заданном промежутке и возвращать их в виде двухмерного массива вида [ [220, 284], [1184, 1210], [2620, 2924] ]. С помощью созданной функции найдите все пары дружественных чисел на промежутке от 1 до 9000.
Вот моё решение:
alert(Freindly(1, 9000));
function Freindly(num1, num2){
    let arr=[[]];
    let sum1 = getSum(getOwnDivisors(num1));
    let sum2 = getSum(getOwnDivisors(num2));
    for(let i=0; i<=2; i++){
        arr.push([i]);
        for(let j=num1; j<num2; j++){
            if(sum1==num2&&sum2==num1){
                arr.push([i][j]);
            }
        }
            return arr;
    }
}
function getOwnDivisors(num){
    let result=[];
	for(let i=1; i<9000; i++){
        if (9000 % i==0){
            result.push(i);
        }
    } return result;
}
function getSum(arr){
    String(arr).split('');
    let sum=0;
    for(elem of arr){
        sum+= Number(elem);
    }
    return sum;
}

Вот чувствую, что я что-то не так делаю, намудрил может быть лишнего, потому и в тупик зашёл. Что в моём решении не так? Подскажите правильное решение.

рони 26.08.2021 15:12

Gm5,
<script>
        function Freindly(min, max) {
            const obj = {};
            for (let i = min; i <= max; i++) {
                obj[i] = getSum(i);
            }
            return Object.entries(obj)
            .filter(([a, b], i) =>  obj[b] && obj[b] == a && a != b )
            .filter((_, i) => i % 2 === 0)
            .map(([a, b]) => [+a, b]);
        }
        function getSum(num) {
            let end = num/2,
                sum = 0;
            for (let i = 1; i <= end; i++) {
                if (num % i === 0) sum += i;
            }
            return sum;
        }
        let x = Freindly(1, 9000);
        document.write(JSON.stringify(x))
    </script>

рони 26.08.2021 15:25

Gm5,
или так ...
<script>
        function Freindly(min, max) {
            const arr = [];
            let e;
            for (let i = min; i <= max; i++) {
                let a = getSum(i), b = getSum(a);
                if(i === b && i != a && (e = !e)) arr.push([i, a])
            }
            return arr
        }
        function getSum(num) {
            let end = num/2,
                sum = 0;
            for (let i = 1; i <= end; i++) {
                if (num % i === 0) sum += i;
            }
            return sum;
        }
        let x = Freindly(1, 9000);
        document.write(JSON.stringify(x))
    </script>

Gm5 26.08.2021 16:41

рони,
СПАСИБО!:thanks:

Brava 07.09.2021 19:50

рони,
прокомментируйте пожалуйста в этой строке
if(i === b && i != a && (e = !e)) arr.push([i, a])
для чего нужно (e = !e). Я понял ,что это помогает не дублировать дружественные числа в массиве с обратной стороны, но как это работает??? )))

рони 07.09.2021 20:11

Цитата:

Сообщение от Brava
но как это работает??? )))

true, false, true, false ... true сохраняем, false пропускаем.


Часовой пояс GMT +3, время: 00:17.