Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   JavaScript cycle (https://javascript.ru/forum/misc/83632-javascript-cycle.html)

Harut97 29.01.2022 09:47

JavaScript cycle
 
Всем доброго дня , я только учусь на web программиста и вот изучаю javascript, и дали задание найти счастливое число (немного грубый перевод с моего языка ) это то число чья сумма цифр на которые она делиться равна ей самой , и от 1-100 есть 2 числа , а от 1-500 есть 3 таких числа , одно из них это 6 (6/ делиться на 1,2,3 ,а 1+2+3=6 , каким методом в javascript я могу найти эти три числа используя цикл ? , где могу прочитать о них? помогите кто знает? заранее блогадарен.

voraa 29.01.2022 10:16

Условие не совсем понятно.
Цитата:

Сообщение от Harut97
сумма цифр на которые она делиться

Например, 34 делится на 2 и 17.
Какая сумма имеется в виду 2+17 (17 - не цифра) или 2+1+7?

рони 29.01.2022 10:25

поиск счастливых чисел
 
Harut97,
https://learn.javascript.ru/operators
https://learn.javascript.ru/array-methods
function findHappiness(start, end) {
            const arr = [];
            for (let i = start; i <= end; i++) {
                let sum = 0,
                    limit = i / 2;
                for (let j = 0; j <= limit; j++) {
                    if (i % j === 0) sum += j;
                }
                if (sum === i) arr.push(i)
            }
            return arr;
        }
        const find = findHappiness(1, 500);
        alert(find);

Harut97 29.01.2022 11:31

Javascript cycle
 
Рони условие было такое найти счастливые числа от 1-100 или от 1 до 500, от 1-100 есть 2 числа, одно из них это 6 (ведь цифры на которые она делиться составляют это же число , то есть 6 делиться на 1,2,3 а 1+2+3=6, исходя из этого принципа , написать цикл который найдет и выведет через document.write() эти 2 счастливых числа от 1-100, заранее спасибо друг

рони 29.01.2022 12:27

Harut97,
что не так в предложенном коде?

Harut97 29.01.2022 13:18

все отлично даже лучше чем я хотел , возможен ли вариант с того же решения только без функции а используя цикл ?просто есть такой вариант или нет ? интересно и еще раз спасибо за помошь друг

рони 29.01.2022 13:26

Harut97,
вы просите то, что у вас уже есть.

Harut97 29.01.2022 13:27

да точно сам уже запутался , спасибо за помошь)

рони 29.01.2022 13:35

Цитата:

Сообщение от Harut97
через document.write()

<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
</head>
<body>
     <script>
        function findHappiness(start, end) {
            const arr = [];
            for (let i = start; i <= end; i++) {
                let sum = 0,
                    limit = i / 2;
                for (let j = 0; j <= limit; j++) {
                    if (i % j === 0) sum += j;
                }
                if (sum == i) arr.push(i)
            }
            return arr;
        }
        let start = 1, end = 100, find = findHappiness(start, end);
        document.write(`${start} - ${end} : ${find}<br>`);
        end = 500;
        find = findHappiness(start, end);
        document.write(`${start} - ${end} : ${find}<br>`);
    </script>
</body>
</html>

Цитата:

Сообщение от Harut97
без функции

<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
</head>
<body>
     <script>
        let start = 1, end = 100;
        let arr = [];
            for (let i = start; i <= end; i++) {
                let sum = 0,
                    limit = i / 2;
                for (let j = 0; j <= limit; j++) {
                    if (i % j === 0) sum += j;
                }
                if (sum == i) arr.push(i)
            }
        document.write(`${start} - ${end} : ${arr}<br>`);
        end = 500;
        arr = [];
            for (let i = start; i <= end; i++) {
                let sum = 0,
                    limit = i / 2;
                for (let j = 0; j <= limit; j++) {
                    if (i % j === 0) sum += j;
                }
                if (sum == i) arr.push(i)
            }
        document.write(`${start} - ${end} : ${arr}<br>`);
    </script>
</body>
</html>

Harut97 29.01.2022 14:22

01
function findHappiness(start, end ) что должна делать эта функция?

Harut97 29.01.2022 14:23

спасибо огромное друг мой очень сильно помог

Harut97 29.01.2022 14:24

по ошибке отправил

рони 29.01.2022 14:58

Цитата:

Сообщение от Harut97
findHappiness(start, end ) что должна делать эта функция?

функция должна вернуть массив чисел из диапазона от start до end которые подходят под условие счастливые

voraa 29.01.2022 17:40

Попробовал до 100 000.
Нашлось еще одно число - 8128 :)
Но удивительно не это.
Удивительно, что Хром считает это за 8,2 - 8,4 с
А Файрфокс за 7,6 - 7,8

И где хваленая оптимизация?

рони 29.01.2022 17:43

voraa,
:)

Alexandroppolus 03.02.2022 20:28

Цитата:

Сообщение от voraa
Попробовал до 100 000.
Удивительно, что Хром считает это за 8,2 - 8,4 с

у меня вообще за 15 с.

слегка оптимизировал вариант рони, стало работать за 90 мс - limit теперь sqrt(i)
function findHappiness(start, end) {
    const arr = [];
    for (let i = start; i <= end; i++) {
        let sum = 1,
            limit = Math.sqrt(i);
        for (let j = 2; j <= limit; j++) {
            if (i % j === 0) {
                const k = i / j;
                sum += j + (k === j ? 0 : k);
            }
        }
        if (sum === i) {
            arr.push(i)
        }
    }
    return arr;
}

рони 03.02.2022 23:34

Alexandroppolus,
спасибо, думал над вариантом Math.sqrt, но не сообразил как второй сомножитель сохранить. :thanks:

Alexandroppolus 04.02.2022 02:47

Вообще эти штуки называются "совершенные числа"

https://ru.wikipedia.org/wiki/%D0%A1...81%D0%BB%D0%BE

Они все имеют вид 2^p * (2*2^p - 1), где выражение в скобках должно быть простым. Точнее, это для четных совершенных. А нечетных возможно и нет вовсе.
То есть искать такие числа можно намного быстрее - просто брать (2*2^p - 1) и проверять что оно простое.

рони 04.02.2022 07:59

Alexandroppolus,
:thanks:


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