Мне так понравился вызов, что мне пришлось написать об этом небольшой пост. Это с сайта Project Euler:

Наибольший простой фактор

Простые множители 13195: 5, 7, 13 и 29.

Какой самый большой простой делитель числа 600851475143?

Ой ... это огромное количество! Но мы справимся, не волнуйтесь! Давайте быстро посмотрим, что такое простое число:

простое число (или простое число) - это натуральное число больше 1, не имеющее положительных делителей, кроме 1 и самого себя. например 3, 5, 7, 9 и т. Д.

Также:

Факторы - это числа, которые мы можем умножить вместе, чтобы получить другое число: Пример: 2 и 3 - это факторы 6, потому что 2 * 3 = 6.

Большой! Спасибо, Википедия! Обладая этими знаниями, мы готовы перейти к следующему шагу, который заключается в сравнении нескольких чисел и их простых множителей. Это поможет нам лучше понять, как решить нашу проблему с помощью наилучшего решения!

Пример 1 ~ 12:

Первым делом разделите число (12 в этом примере) на наименьшее простое число, которым является 2:

12 / 2 = 6

Как мы видим, 6 делится поровну на 2, поэтому мы делаем шаг снова:

6 / 2 = 3

Ибо… Roadblock. Каждый раз, когда мы сталкиваемся с Roadblock, мы увеличиваем divisor на 1:

2 + 1 = 3

Затем продолжаем:

Число / делитель:

3 / 3 = 1

Идеально! Мы добрались до 1, что является нашей целью. Это означает, что основными множителями 12 являются: 2 * 2 * 3, из которых 3 - наш наибольший простой множитель!

Пример 2 ~ 20:

Повторяя те же шаги, что и в нашем первом примере:

20 / 2 = 10

10 / 2 = 5

5 больше не делится на 2 без остатка, поэтому мы добавляем к нему 1 и получаем 3. Но опять 5 он не делится без остатка на 3… ни на 4… но это с 5:

5 / 5 = 1

Большой! 1 снова. Основные множители 20: 2 * 2 * 5, из которых 5 - наш самый большой простой множитель!

Здесь мы начинаем видеть закономерность. Но давайте продолжим еще один пример:

Пример 3 ~ 180

180 / 2 = 90

90 / 2 = 45

Roadblock… Добавление до 3:

45 / 3 = 15

15 / 3 = 5

Roadblock снова… Добавление до 4 - ›Roadblock… Добавление до 5:

5 / 5 = 1

Попался! : D Основные множители 180: 2 * 2 * 3 * 3 * 5, из которых 5 снова наш наибольший простой множитель!

Это алгоритм, который мы собираемся реализовать в JavaScript: пока наш number равномерно делится на наш divisor, мы делим number на divisor, когда он больше не делится без остатка, мы увеличиваем divisor на 1. Легко, правда? Напишем для него код:

Решение JavaScript

Как мы уже говорили выше, нам понадобится divisor, у которого будет начальное значение: 2:

var divisor = 2; 

Также давайте сохраним этот большой number в переменную:

var divisor = 2;
var number = 600851475143;

Хороший. Теперь о цикле while. Пока number больше 1…

var divisor = 2;
var number = 600851475143;
while(number > 1){
}

Если number делится на divisor:

var divisor = 2;
var number = 600851475143;
while(number > 1){
    if(number % divisor === 0){
    }
}

Разделите number на divisor:

var divisor = 2;
var number = 600851475143;
while(number > 1){
    if(number % divisor === 0){ 
        number /= divisor;
    }
}

Примечание. x /= divisor - это то же самое, что сказать: x = x / divisor.

Иначе увеличьте divisor:

var divisor = 2;
var number = 600851475143;
while(number > 1){
    if(number % divisor === 0){ 
        number /= divisor;
    } else {
        divisor++;
    }
}

Поздравляем! По окончании цикла while делитель будет равен наибольшему простому множителю 600851475143.

var divisor = 2;
var number = 600851475143;
while(number > 1){
    if(number % divisor === 0){ 
        number /= divisor;
    } else {
        divisor++;
    }
}
console.log(divisor); // the largest prime factor of 600851475143

Я не дам тебе ответа. : D Вы можете запустить код и написать в комментариях под правильным ответом. ;)

Заключение

Это испытание определенно доставило мне большое удовольствие. Я многому научился, просто пытаясь решить эту проблему другим способом, чем я первоначально думал. : D Я бы сказал, что стоит потратить время на поиск лучшего решения проблемы.

Небольшое примечание: мы видим, что 2 - единственное четное простое число. Это означает, что когда делитель становится 3, мы можем увеличить его на 2 вместо 1, например: 2, 3, 5, 7, 9
Также есть дополнительное условие, которое мы могли бы иметь в цикле while, чтобы алгоритм был намного более эффективным для даже большие числа. Но я позволю тебе узнать, что это. ^ _ ^

Надеюсь, вам понравился этот вызов. Если да, то я был бы искренне признателен, если вы нажмете кнопку Рекомендовать. 💚