Премьер-алгоритм реверсии на JavaScript


Я решены следующие проблемы:

Рассмотрим диапазоне от 0 до 10. Простые числа в этом диапазоне: 2, 3, 5, 7, и, следовательно, премьер-пар: (2,2), (2,3), (2,5), (2,7), (3,3), (3,5), (3,7),(5,5), (5,7), (7,7).

Давайте возьмем одну пару (2,7) как пример и получите товар, то сумма цифр результата следующим образом: 2 * 7 = 14 и 1 + 4 = 5. Мы видим, что 5-простое число. Аналогично, для пары (7,7), мы получим: 7 * 7 = 49, а 4 + 9 = 13, которое является простым числом.

Вам будет предоставлен выбор, и ваша задача-вернуть количество пар, что вернуться в Премьер, как показано выше. В диапазоне (0,10), есть только 4 таких пар, что в конечном итоге простые подобным образом: (2,7), (3,7), (5,5), (7,7). Таким образом, решить(0,10) = 4)

Обратите внимание, что верхним диапазона не превысит 10000. Диапазоне (0,10) означает, что: 0 <= Н < 10.

Мне было интересно, если мое решение может быть улучшена или, если я должен использовать совершенно другой подход.

function isPrime(n) {
    if(n < 2){
        return false;
    }
    for (var i = 2; i <= parseInt(Math.sqrt(n)); i++) {
        if (n % i === 0) {
            return false;
        }
    }
    return true;
}

function getPrimes(s, e) {
    var primes = [];
    for (var p = s; p <= e; p++) {
        if(isPrime(p)){
            primes.push(p);
        }
    }
    return primes;
}

function generatePairs(primes){
    var pairs = [];
    for(var i = 0; i < primes.length; i++){
        for(var j = i; j < primes.length; j++){
            pairs.push([primes[i], primes[j]]);
        }
    }
    return pairs;
}

function sumDigits(n){
    var sum = 0;
    while(n > 0){
        sum += n % 10;
        n = parseInt(n/10);
    }
    return sum;
}

function solve(a, b) {
    var pairs = generatePairs(getPrimes(a, b - 1));
    var res = 0;
    for(pair of pairs){
        var tmp = sumDigits(pair[0] * pair[1]);
        if(isPrime(tmp)){
            res++;
        }

    }
    return res;
}


113
1
задан 21 февраля 2018 в 10:02 Источник Поделиться
Комментарии
1 ответ

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

parseInt используется для преобразования строки в число. Если вы просто хотите, чтобы пол число, используйте Math.floor вместо. Это значительно быстрее.

В isPrime функции каждой итерации цикла вычисляется тот же квадратный корень, который не является простой расчет. Магазин квадратный корень в переменную до цикла, и сравнить с тем, что.

В getPrimes функция работает отлично, но есть потенциал для оптимизации, основанные на том, что мы знаем о простых. Например, за исключением 2, все числа нечетна, поэтому вам нужно только проверить каждый второй ряд. Вы также можете посмотреть на другие способы, как премьер-решето.

Нет причин по-прежнему является var. Использовать let и const.

1
ответ дан 21 февраля 2018 в 04:02 Источник Поделиться