Как найти все делители числа javascript

function findDividers(start, end) {

  var dividers = [];
  for (let i = start + 1; i < end; i++) {
    dividers.push(i);
  }
  console.log(dividers);
}

findDividers(200, 500);

Есть массив чисел от 201 до 499, и нужно для каждого из этих чисел найти сумму всех его делителей.

Я пытался записать ее как то так, но ничего не вышло, уже второй день ломаю голову, и все никак решение не найду

var dividersDiv = [];
for (let j = 0; j < dividers.length; j++) {
  if (dividers % j == 0) {
    dividersDiv.push(j);
    console.log(dividersDiv);
  }

Air's user avatar

Air

14.4k6 золотых знаков32 серебряных знака67 бронзовых знаков

задан 4 июн 2018 в 17:13

Reep's user avatar

function findDividers( start, end ) {
  const sumArr = [];

  for(let i = start; i <= end; i++) {
    let sum = 0;
    
    for(let j = 0; j <= i; j++) {
      if(i % j === 0) sum += j;
    }
    
    sumArr.push(sum)
  }
  
  return sumArr;
}

console.log(findDividers(201, 499));

ответ дан 4 июн 2018 в 17:24

MedvedevDev's user avatar

MedvedevDevMedvedevDev

5,17412 серебряных знаков25 бронзовых знаков

Данный код будет складывать ВСЕ целочисленные делители (включая 1 и само число)

function findDividers(start, end) {
  let answ = [];
  for (let i=start+1; i<end; i++){ //каждое число с 201 до 499
    let sum = 0;
    for (let j=1; j<=i; j++) { //каждая цифра с 1 до самого числа
      if (i%j==0) { sum += j;} //если остаток от деления = 0, то складываем
    }
    answ.push(sum); //добавляем в массив сумму
  }
  return answ;
}

console.log('Answer:');
console.log(findDividers(200, 500));

если нужна сумма не учитывая число и еденичку, то строчку

for (let j=1; j<=i; j++) {

меняем на

for (let j=2; j<i; j++) {

ответ дан 13 янв 2021 в 7:33

Никита Киселёв's user avatar

Some general remarks:

  • Variables should be declared explicitly with var, otherwise you
    create a global variable.
  • The indent amount is different between the first level and the
    deeper levels.
  • The spacing is not consistent: while ( vs if(. Generally I would
    insert a space at least after keywords, and around parentheses/braces etc.

Your implementation is correct but not efficient, as the number of loop iterations
and remainder operations is equal to the input number.

The count of divisors can be efficiently computed from the
prime number factorization: If
$$
n = p_1^{e_1} , p_2^{e_2} cdots p_k^{e_k}
$$
is the factorization of $ n $ into prime numbers $ p_i $
with exponents $ e_i $, then
$$
sigma_0(n) = (e_1+1)(e_2+1) cdots (e_k+1)
$$
is the number of divisors of $ n $, see for example
Wikipedia: Divisor function. Example:
$$
720 = 2^4 cdot 3^2 cdot 5^1 Longrightarrow
sigma_0(720) = (4+1)(2+1)(1+1) = 30 , .
$$

An implementation in JavaScript would be

function getDivisorsCnt(n){

    var numDivisors = 1;
    var factor = 2; // Candidate for prime factor of `n`

    // If `n` is not a prime number then it must have one factor
    // which is <= `sqrt(n)`, so we try these first:
    while (factor * factor <= n) {
        if (n % factor === 0) {
            // `factor` is a prime factor of `n`, determine the exponent:
            var exponent = 0;
            do {
                n /= factor;
                exponent++;
            } while (n % factor === 0)
            // `factor^exponent` is one term in the prime factorization of n,
            // this contributes as factor `exponent + 1`:
            numDivisors *= exponent + 1;
        }
        // Next possible prime factor:
        factor = factor == 2 ? 3 : factor + 2
    }

    // Now `n` is either 1 or a prime number. In the latter case,
    // it contributes a factor 2:
    if (n > 1) {
        numDivisors *= 2;
    }

    return numDivisors;
}

As an example, getDivisorsCnt(720) requires 720 remainder operations
in your algorithm, but only 8 remainder operations and 6 divisions in this algorithm.



Знаток

(258),
закрыт



10 лет назад

Дополнен 10 лет назад

Проблема в том, как записать без остатка оно разделилось или нет

Ю В

Мыслитель

(9450)


10 лет назад

А в чем проблема? Запускаешь цикл от 2 до заданного числа и проверяешь, если разделилось без остатка, значит, выводишь на экран. Все.

Удачник

Высший разум

(141080)


10 лет назад

Надо проверить все числа от 1 до квадратного корня из n
var i, n: integer
var Mes: string
BEGIN
readln(n)
for i = 1 to sqrt(n) do
begin
if n mod i = 0 then Mes = Mes + i + ‘, ‘;
end;
END.

Команда
n mod i = 0
и означает, что деление n на i прошло без остатка.

wladislaw Shavyrin

Ученик

(108)


4 года назад

function calculate(num) {
let array = [1]
var half = Math.floor(num / 2),
i,
j
num % 2 === 0 ? ((i = 2), (j = 1)) : ((i = 3), (j = 2))

for (i; i <= half; i += j) {
num % i === 0? array.push(i) : false
}
array.push(num)
return array
}

function task_10() { // Задание 10: Игра “Угадай число”. Предложить пользователю загадать число от 0 до 100 и отгадать // его следующим способом: каждую итерацию цикла делите диапазон чисел пополам, записываете // результат в N и спрашиваете у пользователя “Ваше число > N, < N или == N?”. В зависимости // от того, что указал пользователь, уменьшаете диапазон. Начальный диапазон от 0 до 100, // поделили пополаи и получили 50. Если пользователь указал, что его число > 50, то изменили // диапазон на от 51 до 100. И так до тех пор, пока пользователь не выберет == N. alert( ‘Задание 10: Игра “Угадай число”. Предложить пользователю загадать число от 0 до 100 и отгадать его следующим способом: каждую итерацию цикла делите диапазон чисел пополам, записываете результат в N и спрашиваете у пользователя “Ваше число > N, < N или == N?”. В зависимости от того, что указал пользователь, уменьшаете диапазон. Начальный диапазон от 0 до 100, поделили пополаи и получили 50. Если пользователь указал, что его число > 50, то изменили диапазон на от 51 до 100. И так до те пор, пока пользователь не выберет == N.’ ); alert( “Что ж, давайте поиграем! Только честно и без мухлежа! Сейчас я вам предложу ввести целое число в диапазоне от 0 до 100. Потом я логическими вопросами буду отсекать ненужные числа и докажу, что угадаю ваше загаданное число не более чем за 7 попыток! Прошу не лукавить и не мухлевать!” ); let N = 0; do { N = Math.trunc( +prompt(“Введите целое число в диапазоне от 0 до 100 включительно: “) ); } while (N < 0 || N > 100); alert(`Итак, будем играться с числом ${N}.`); let counter = 0; // счётчик попыток угадать число let low = 0; // нижняя граница диапазона разбиения let middle = 0; // середина разбиения диапазона let high = 100; // верхняя граница разбиения диапазона let condition = “”; // отклик пользователя =, <, > на предложенный вариант числа, пока что просто пустая строка while (low <= high) { middle = Math.trunc((low + high) / 2); condition = prompt( `Вы загадали число ${middle}? Введите без кавычек “=”, если это так. В противном случае, если искомое число меньше, введите “<“, либо же “>”, если оно больше. Опять же, без кавычек.` ); // это был отклик пользователя if (condition != “=” && condition != “<” && condition != “>”) { alert( “Вы вводите посторонние символы, я вас не понимаю! Будьте внимательнее!” ); continue; // здесь исключаем ввод опечаток } if ( (condition != “=” && middle == N) || (condition == “<” && middle < N) || (condition == “>” && middle > N) || (condition == “=” && middle != N) ) { alert( `Кто-то мухлюет! Знак “${condition}” здесь совсем неуместен! Попробуйте снова!` ); continue; } // здесь исключаем ложь в ответах if (condition == “>”) { low = middle + 1; } else if (condition == “<“) { high = middle – 1; } else { low = high + 1; } counter++; } alert( `Итак, за ${counter} попыток бинарным поиском мы установили, что вы загадали число ${middle}!` ); } task_10(); function task_9() { // Задание 9: Вывести таблицу умножения для всех чисел от 2 до 9. Каждое число необходимо умножить на числа от 1 до 10. alert( “Задание 9: Вывести таблицу умножения для всех чисел от 2 до 9. Каждое число необходимо умножить на числа от 1 до 10.” ); let table = “”; for (let i = 2; i <= 9; i++) { for (let j = 1; j <= 10; j++) { table += `${i} x ${j} = ` + i * j + “, “; } } alert(table); } task_9(); function task_8() { // Задание 8: Зациклить вывод дней недели таким образом:”День недели. Хотите увидеть следующий день?” // и так до до тех пор, пока пользователь нажимает ОК. alert( ‘Задание 8: Зациклить вывод дней недели таким образом:”День недели. Хотите увидеть следующий день?” и так до до тех пор, пока пользователь нажимает ОК.’ ); let arr_Week = [ “Понедельник”, “Вторник”, “Среда”, “Четверг”, “Пятница”, “Суббота”, “Воскресенье”, ]; let i = 0; let stop = true; while (stop == true) { stop = confirm(`${arr_Week[i]}. Хотите увидеть следующий день недели?`); i++; if (i > 6) { i = 0; } } alert(“Вывод дней недели окончен!”); } task_8(); function task_7() { // Задание 7_1: Запросить у пользователя число и на сколько цифр его сдвинуть. Сдвинуть цифры числа и вывести // результат (если число 123456 сдвинуть на 2 цифры, то получится 345612). alert( “Задание 7_1: Запросить у пользователя число и на сколько цифр его сдвинуть. Сдвинуть цифры числа и вывести результат (если число 123456 сдвинуть на 2 цифры, то получится 345612).” ); let base_number = prompt(“Введите число, которое будем трансформировать: “); let jump = Math.abs( Math.trunc( +prompt(“Введите, на сколько позиций вы хотите произвести сдвиг: “) ) ); let arr = base_number.split(“”); jump = jump % arr.length; //если пользователь указал при сдвиге число больше длины строки let leftJump_L = arr.slice(0, jump); //новая строка при сдвиге влево (левая половинка начальной, которая уедет в конец новой строки) let leftJump_R = arr.slice(jump, arr.length); //новая строка при сдвиге влево (правая половинка начальной, которая уедет в начало новой строки) alert( `Сдвиг влево “${base_number}” на ${jump} позиций: ` + leftJump_R.concat(leftJump_L).join(“”) ); //объединяем 2 половины let rightJump_L = arr.slice(0, arr.length – jump); //новая строка при сдвиге вправо (левая половинка начальной, которая уедет в конец новой строки) let rightJump_R = arr.slice(arr.length – jump, arr.length); //новая строка при сдвиге вправо (правая половинка начальной, которая уедет в начало новой строки) alert( `Сдвиг вправо “${base_number}” на ${jump} позиций: ` + rightJump_R.concat(rightJump_L).join(“”) ); //объединяем 2 половины } task_7(); function task_7_2() { // Запросить у пользователя число и на сколько цифр его сдвинуть. Сдвинуть цифры числа и вывести // результат (если число 123456 сдвинуть на 2 цифры, то получится 345612). // Вариант 2: решим через циклы, а не массивы alert( “Задание 7_2: ВТОРОЙ ВАРИАНТ РЕШЕНИЯ ЗАДАЧИ МЕТОДОМ ЦИКЛОВ. Запросить у пользователя число и на сколько цифр его сдвинуть. Сдвинуть цифры числа и вывести результат (если число 123456 сдвинуть на 2 цифры, то получится 345612).” ); let base_number = Math.abs( Math.trunc(+prompt(“Введите число, которое будем трансформировать: “)) ); let jump = Math.abs( Math.trunc( +prompt(“Введите, на сколько позиций вы хотите произвести сдвиг: “) ) ); let array = []; let new_base_number = base_number; while (base_number > 0) { array.unshift(base_number % 10); base_number = Math.trunc(base_number / 10); } // в этом цикле мы разбили число по разрядам, каждую цифру разряда числа вписали в массив let new_jump = jump; jump = jump % array.length; //если пользователь указал при сдвиге число больше длины строки // с данного места приступаем к работе со сдвигом let arrJumpLeft_L = []; let arrJumpLeft_R = []; let arrJumpRight_L = []; let arrJumpRight_R = []; for (let i = 0; i < array.length; i++) { if (i < jump) { arrJumpLeft_L[i] = array[i]; } else { arrJumpLeft_R[i] = array[i]; } if (i < array.length – jump) { arrJumpRight_L[i] = array[i]; } else { arrJumpRight_R[i] = array[i]; } } alert( `Сдвиг вправо “${new_base_number}” на ${new_jump} позиции: ` + arrJumpRight_R.concat(arrJumpRight_L).join(“”) ); //объединяем 2 половины alert( `Сдвиг влево “${new_base_number}” на ${new_jump} позиции: ` + arrJumpLeft_R.concat(arrJumpLeft_L).join(“”) ); //объединяем 2 половины } task_7_2(); function task_6() { // Зациклить калькулятор. Запросить у пользователя 2 числа и знак, решить пример, вывести результат и спросить, //хочет ли он решить еще один пример. И так до тех пор, пока пользователь не откажется. alert( “Задание 6: Зациклить калькулятор. Запросить у пользователя 2 числа и знак, решить пример, вывести результат и спросить, хочет ли он решить еще один пример. И так до тех пор, пока пользователь не откажется.” ); let numberA = 0; let numberB = 0; let result = true; let action_sign = “”; do { numberA = +prompt(“Введите первое число: “); numberB = +prompt(“Введите второе число: “); action_sign = prompt(“Введите знак операции (*, /, + либо -): “); switch (action_sign) { case “+”: alert( `${numberA} ${action_sign} ${numberB} = ${numberA + numberB}` ); break; case “-“: alert( `${numberA} ${action_sign} ${numberB} = ${numberA – numberB}` ); break; case “*”: alert( `${numberA} ${action_sign} ${numberB} = ${numberA * numberB}` ); break; case “/”: alert( `${numberA} ${action_sign} ${numberB} = ${numberA / numberB}` ); break; default: alert(`Вы не ввели знак математической операции!`); break; } result = confirm(“Хотите выполнить еще одну математическую операцию?”); } while (result == true); } task_6(); function task_5() { // Задание 5: Запросить у пользователя 10 чисел и подсчитать, сколько он ввел положительных, // отрицательных и нулей. При этом также подсчитать, сколько четных и нечетных. Вывести // статистику на экран. Учтите, что достаточно одной переменной (не 10) для ввода // чисел пользователем. alert( “Задание 5: Запросить у пользователя 10 чисел и подсчитать, сколько он ввел положительных, отрицательных и нулей. При этом также подсчитать, сколько четных и нечетных. Вывести статистику на экран. Учтите, что достаточно одной переменной (не 10) для ввода чисел пользователем.” ); let n = 0; let positive_number = 0; let negative_number = 0; let null_number = 0; let even_number = 0; let odd_number = 0; for (let i = 0; i < 10; i++) { n = +prompt(“Введите число: “); if (n > 0) { positive_number += 1; } else if (n < 0) { negative_number += 1; } else { null_number += 1; } !(n % 2) ? (even_number += 1) : (odd_number += 1); } alert( `Из 10 введеных вами чисел ${positive_number} положительных, ${negative_number} отрицательных, ${null_number} равных нулю, ${even_number} четных и ${odd_number} нечетных.` ); } task_5(); function task_4() { // Задание 4: Определить количество чисел в введенном числе. alert(“Задание 4: Определить количество чисел в введенном числе.”); let n = Math.abs(+prompt(“Введите число: “)); let counter = 0; while (n > 0) { n = Math.trunc(n / 10); counter++; } alert(`В введенном вами числе (в его целой части) ${counter} цифр.`); } task_4(); function task_3() { // Задание 3: Запросить у пользователя число и вывести все делители этого числа. alert( “Задание 3: Запросить у пользователя число и вывести все делители этого числа.” ); let n = +prompt(“Введите число: “); let new_n = Math.abs(n); let divisors = “”; let i = 1; do { if (new_n % i == 0) { divisors += i + “,”; } i++; } while (i <= new_n); alert(`У числа ${n} следующие делители: ${divisors}`); } task_3(); function task_2() { // Задание 2: Запросить у пользователя 2 числа и найти только наибольший общий делитель. alert( “Задание 2: Запросить у пользователя число и вывести все делители этого числа.” ); let n = +prompt(“Введите первое число: “); let m = +prompt(“Введите второе число: “); let new_n = Math.abs(n); let new_m = Math.abs(m); let max_divisor = 1; let i = 1; while (i <= new_n && i <= new_m) { if (new_n % i == 0 && new_m % i == 0) { max_divisor = i; } i++; } alert(`У чисел ${n} и ${m} наибольший общий делитель: ${max_divisor}`); } task_2(); function task_1() { // Задание 1: Подсчитать сумму всех чисел в заданном пользователем диапазоне. alert( “Задание 1: Подсчитать сумму всех чисел в заданном пользователем диапазоне.” ); let a = Math.trunc( +prompt(“Задайте целое число, которое будет началом диапазона: “) ); let a1 = a; let b; do { b = Math.trunc( +prompt(“Задайте целое число, которое будет концом диапазона: “) ); } while (a >= b); let summa = 0; while (a <= b) { summa += a; a++; } alert(`В диапазоне от ${a1} до ${b} включительно сумма всех чисел составляет: ${summa}.`); } task_1();
  • Подсчитать сумму всех чисел в заданном пользователем диапазоне.

        let num1 = Number(prompt('Для подсчета суммы чисел в заданном диапазоне введите начальную цифру диапазона'));
        let num2 = Number(prompt('Введите конечную цифру'));
        let sum = 0;
    
        if (num1 < num2) {
            while (num1 <= num2) {
                sum += num1;
                num1++;
            };
        } else if (num1 > num2) {
            while (num1 >= num2) {
                sum += num2;
                num2++;
            };
        };
        alert(`Сумма всех чисел в указанном диапазоне ${sum}`);
                    
  • Запросить 2 числа и найти только наибольший общий делитель.

        let number1 = Number(prompt('Для нахождения НОД двух чисел введите первую цифру'));
        let number2 = Number(prompt('Введите вторую цифру'));
    
        while (number1 != 0 && number2 != 0) {
            if (number1 > number2) {
                number1 = number1 % number2;
            } else {
                number2 = number2 % number1;
            };
        };
        alert(` Наибольший общий делитель двух указанных чисел равен ${number1 + number2}`);
                    
  • Запросить у пользователя число и вывести все делители этого числа.

        let number = Number(prompt(' Введите число'));
        let divisor = [];
        for (let i = 2; i < number; i++) {
            if (number % i == 0 && number !== 1 ) {
                console.log(i);
                divisor.push(i);
            };
        };
        alert(`Все делители числа ${number}:  ${divisor}`);
                    
  • Определить количество цифр в введенном числе.

        let userNumber = prompt(' Введите число'); 
        let count = 0;
    
        for (let i = 0; i < userNumber.length; i++) {
            count += 1;
        };
        alert(` Число состоит из ${count} цифр`);
                    
  • Запросить у пользователя 10 чисел и подсчитать, сколько он ввел положительных, отрицательных и нулей. При этом также посчитать, сколько четных и нечетных. Вывести статистику на экран. Учтите, что достаточно одной переменной (не 10) для ввода чисел пользователем.

        let positive = 0;
        let negative = 0;
        let zero = 0;
        let even = 0;
        let odd = 0;
    
        for (let i = 1; i <= 10; i++ ) {
            const num = prompt("Введите число");
            
            if (num > 0) {
            positive++;
            };
            if (num < 0) {
            negative++;
            };
            if (num == 0) {
            zero++;
            };
            if (num % 2 == 0) {
            even++;
            };
            if (num % 2 !== 0) {
            odd++;
            };
        };
    
        alert(` Из введенных цифр - положительных: ${positive}, отрицательных: ${negative}, нулей: ${zero}, четных: ${even}, нечетных: ${odd}.`)
                    
  • Зациклить калькулятор. Запросить у пользователя 2 числа и знак, решить пример, вывести результат и спросить, хочет ли он решить еще один пример. И так до тех пор, пока пользователь не откажется.

        do {
            let firstNumber = prompt(' Введите первое число');
            let secondNumber = prompt(' Введите второе число');
            let operator = prompt(' Введите математический оператор', '+, -, *, /')
            let answer = eval(`${firstNumber} ${operator} ${secondNumber}`);
            alert(`Ответ ${answer}`);
            
        } while (confirm(' Решить еще один пример?'));
                    
  • Запросить у пользователя число и на сколько цифр его сдвинуть. Сдвинуть цифры числа и вывести результат (если число 123456 сдвинуть на 2 цифры, то получится 345612).

        do {
            let q = prompt(' Введите число', '1234567890');
            let move = Number( prompt(' На сколько цифр сдвинуть?') );
            alert(q.slice(move) + q.slice(0, move));
    
        } while (confirm(' Еще одно число ?'));
                    
  • Зациклить вывод дней недели таким образом: «День недели. Хотите увидеть следующий день?» и так до тех пор, пока пользователь нажимает OK.

        const days = ["понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"];
        let currentDay = 0;
        let nextDay;
        do {
            alert(`День недели - ${days[currentDay]}.`);
            nextDay = confirm(' Хотите увидеть следующий день?');
            currentDay++;          
            if (currentDay === days.length) {
                currentDay = 0;
            };         
    
        } while (nextDay);
                    
  • Вывести таблицу умножения для всех чисел от 2 до 9. Каждое число необходимо умножить на числа от 1 до 10.

        let tables = [];
    
        for (let i = 2; i <= 9; i++) {
            tables.push(`n Таблица умножения ${i}:n`);
            for (let j = 1; j <=10; j++) {
                tables.push(`${i} * ${j} = ${i*j}; `);
            };
        };
        alert(tables.join(''));
        console.log(tables.join(''));
                    
  • Игра «Угадай число». Предложить пользователю загадать число от 0 до 100 и отгадать его следующим способом: каждую итерацию цикла делите диапазон чисел пополам, записываете результат в N и спрашиваете у пользователя «Ваше число > N, < N или == N?». В зависимости от того, что указал пользователь, уменьшаете диапазон. Начальный диапазон от 0 до 100, поделили пополам и получили 50. Если пользователь указал, что его число > 50, то изменили диапазон на от 51 до 100. И так до тех пор, пока пользователь не выберет == N.

        let guessedNum = Number(alert("Загадайте число от 1 до 100"));
        let lowerLimit = 0;
        let upperLimit = 100;
        let N = 50;
    
        while (guessedNum !== N ) {
            let answer = prompt(`Ваше число >, <, или равно ${N}`, '>, <, =');
            if (answer == '>') {
                lowerLimit = N;
                N = Math.ceil((upperLimit - lowerLimit) / 2 + lowerLimit);
            } else if (answer == '<') {
                upperLimit = N; 
                N = Math.ceil((upperLimit - lowerLimit) / 2 + lowerLimit);
            } else {
                break;
            };
        };
        alert(`Задуманное число ${N}`);
                    
  • Добавить комментарий