код, чтобы проверить, если число является простым числом


Я написал код, чтобы проверить, если число является простым числом не является.

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

Я написал функцию для него, который возвращает булево значение.

(function(){
    'use strict';

    main();

    function main(){
        var testNum = getCommandLineVariables();
        console.log("Is Number \""+testNum+"\" a prime number ? ",isPrimeNumber(testNum));
    }


    function isPrimeNumber(num){
        var halfNum = num/2;
        halfNum = parseInt(halfNum);

        // check if number is divisible by 2, 
        // if yes then its not a prime number.
        if(num%2 === 0){
            return false;
        }


        do{
            // if number is divisible by its half value, 
            // if yes, than its not prime number    
            if(num%halfNum === 0){
                return false;
            }

        }while(--halfNum >= 2); // reduce the half-value by 1 and continue

        return true;
    } // end of isPrimeNumber

    // get the number from commandline argument
    function getCommandLineVariables(){
        var arg_array = process.argv.slice(2);

        if(arg_array.length !== 1){
            throw new Error("Pass a number");
        }


        return parseInt(arg_array[0]);
    } // end of getCommandLineVariables 
})();

Я запустить программу следующим образом:

E:\math>node isPrimeNum01.js 13
Is Number "13" a prime number ?  true

E:\math>node isPrimeNum01.js 16
Is Number "16" a prime number ?  false

E:\math>node isPrimeNum01.js 29
Is Number "29" a prime number ?  true

E:\math>node isPrimeNum01.js 113
Is Number "113" a prime number ?  true

E:\math>node isPrimeNum01.js 127
Is Number "127" a prime number ?  true

E:\math>node isPrimeNum01.js 566
Is Number "566" a prime number ?  false

E:\math>

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



Комментарии
1 ответ

Я просто глядя на вашу основную функцию.

Вы получили право идея, но вы упустили некоторые пограничные случаи, а также может быть оптимизировано. 2 и 3 являются простыми, но возвращать false, поскольку halfNum начинается с 1, и do...while петли всегда выполняется по крайней мере один раз. 1 не простыми, а возвращать значение true, наряду с некоторыми отрицательными числами. Самый простой способ справиться с этим, просто чтобы проверить это особый случай в начале функции.

if(n <= 1) return false;

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

for(let i = 2; i <= halfNum; i++)

Но мы можем оптимизировать это, поскольку нам нужно только проверить на квадратный корень из числа. Для любого делимое число большее, чем квадратный корень, также будет кратно количеству меньше, чем квадратный корень. Например, 100 делится на 20, но и 5, так как 20*5=100. Я тоже собираюсь предварительно вычислить его и переименовать halfNum как это имя не подходит больше.

const limit = Math.sqrt(num);

Итоговая функция выглядит так.

function isPrime(num) {
if(num <= 1) return false;
const limit = Math.floor(Math.sqrt(num));
for(let i = 2; i <= limit; i++) {
if(num % i === 0) return false;
}
return true;
}

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