Простые числа JavaScript

Может кто-нибудь дать мне руководство по получению здесь простых чисел? Это домашнее задание, поэтому я не хочу ответа, но некоторые советы будут с благодарностью. Это действительно раздражает меня:(

Я думаю, что я рядом. Но у меня есть проблемы с номерами 25 и 35. Они не простые, но функция возвращает их

var getPrimeNumber = function(n) {
    if(n === 1) return "";
    else if(n == 2) return 2;
    else if(n == 3) return 3;
    else { 
        for(i=Math.floor(Math.sqrt(n)); i>=2; i--){
            //console.log(i);//maybe another var in here? 
            if(n%i !==0 && n%2 !==0 && n%3 !== 0)
                return n; // 25/Math.sqrt(25) will be equal to zero this is what gives me 25 !!!   
        } 
    }
};

13 ответов

На основании этой страницы это будет метод определения, является ли число простым числом:

function isPrime(number) {
    let start = 2;
    const limit = Math.sqrt(number);
    while (start <= limit) {
        if (number % start++ < 1) return false;
    }
    return number > 1;
}

В node.js для определения простых чисел от 2 до 100000 требуется около 250 мс.

Смотрите также...

Вот самый быстрый способ вычисления простых чисел в JavaScript на основе предыдущего простого значения.

function nextPrime(value) {
    if (value > 2) {
        var i, q;
        do {
            i = 3;
            value += 2;
            q = Math.floor(Math.sqrt(value));
            while (i <= q && value % i) {
                i += 2;
            }
        } while (i <= q);
        return value;
    }
    return value === 2 ? 3 : 2;
}

Тестовое задание

var value, result = [];
for (var i = 0; i < 10; i++) {
    value = nextPrime(value);
    result.push(value);
}
console.log("Primes:", result);

Выход

Primes: [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]

Это очень быстро, потому что:

  • Выравнивает ограничение цикла в целое число;
  • Он использует более короткий цикл итерации, пропуская четные числа.

Он может дать вам первые 100 000 простых чисел примерно за 130 мсек или первые 1 м простых чисел за 4 секунды.

    function nextPrime(value) {
        if (value > 2) {
            var i, q;
            do {
                i = 3;
                value += 2;
                q = Math.floor(Math.sqrt(value));
                while (i <= q && value % i) {
                    i += 2;
                }
            } while (i <= q);
            return value;
        }
        return value === 2 ? 3 : 2;
    }

    var value, result = [];
    for (var i = 0; i < 10; i++) {
        value = nextPrime(value);
        result.push(value);
    }

    display("Primes: " + result.join(', '));

    function display(msg) {
        document.body.insertAdjacentHTML(
            "beforeend",
            "<p>" + msg + "</p>"
        );
    }

Есть функция, которая будет возвращать true, если число простое, и false, если это не так:

function isPrime(x){     
      d = x-1;
      while (d > 1){
        if ((x % d) == 0) return false;
        d--;
      }
      return true;
    }

Оформить заказ демо: http://jsbin.com/velapabedi/1/

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  
  <script>
    function isPrime(x){     
      d = x-1;
      while (d > 1){
        if ((x % d) == 0) return false;
        d--;
      }
      return true;       
      
    }
    
    
    if (isPrime(41)){
      alert('Prime');
    }
    else{
      alert('Not Prime');
    }
  </script>
</head>
<body>

</body>
</html>

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

function isPrime(num) {
    //check if value is a natural numbers (integer)
    //without this check, it returns true
    if (isNaN(num) || num % 1 !== 0) {
        return false;
    }
    num = Math.abs(num); //*negative values can be primes
    if (num === 0 || num === 1) {
        return false;
    }
    const maxFactorNum = Math.sqrt(num);
    for (let i = 2; i <= maxFactorNum; i++) {
        if (num % i === 0) {
            return false;
        }
    }
    return true;
}

//this method in action
for (let i = 1; i <= 40; i++) {
    console.log(i + (isPrime(i) ? ", isPrime" : ""));
}
//checking anomalies
console.log(isPrime(1.22));
console.log(isPrime(1.44));
console.log(isPrime("string"));

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

Вот простое "сито" для простых чисел, которое легко понять, и, хотя это наивный подход (в отличие от сложных эффективных тестов простых чисел, таких как тест AKS), оно довольно быстрое (10000 чисел, проверенных в < 1 сек). Он хранит найденные простые числа в массиве prim[] и тестирует с помощью функции по модулю (%):

Цикл проверяет наличие уже найденных простых чисел и завершается, если оно не является простым числом, т. Е. Если по модулю результат равен 0 (см. Выражение i % prim[j])===0). В противном случае он добавляет его в список найденных простых чисел.

Обратите внимание, что, поскольку единственное четное простое число равно 2, шаг цикла равен 2, а не 1, поскольку начиная с 3 и далее не может быть дальнейших четных чисел.

var MaxNum = 10000;
var prim;

function Main() {
  MaxNum = GetMaxNum();
  prim = CalculatePrimes(MaxNum);
  CheckSome();
}

function CalculatePrimes(pMaxNum) {
  Console.WriteLine("Calculating until " + pMaxNum + "...");
  var _prim = [2];
  if (pMaxNum > 2) {
    for (var i = 3; i < pMaxNum; i += 2) {
      var is_prim = true;
      if (_prim.length > 0) {
        for (var j = 0; j < _prim.length; j++) {
          if ((i % _prim[j]) === 0) {
            is_prim = false;
            break;
          }
        }
      }
      if (is_prim) {
        _prim.push(i);
      }
    }
  }
  Console.WriteLine("Prime numbers:");
  for (var i = 0; i < _prim.length; i++) {
    Console.Write(_prim[i] + " ");
  }
  Console.WriteLine();
  Console.WriteLine("Found " + _prim.length + " prime numbers.");
  Console.WriteLine();
  return _prim;
}

// test some individual pre-calculated numbers

function CheckSome() {
  var num1 = prim[prim.length - 1];
  var num2 = num1 - 1;
  Console.WriteLine("Test: " + num1.toString() + ". Is it a prime number? " + Is_prime(num1));
  Console.WriteLine("Test: " + num2.toString() + ". Is it a prime number? " + Is_prime(num2));
}

function Is_prime(n) {
  if (n > MaxNum) throw "ERROR: n must be <" + MaxNum + "!";
  if (prim.indexOf(n) === -1)
    return false;
  else
    return true;
};


// ------------ HELPERS to display on screen ------------
var Console = {
  Section: 1,
  SectionId: "#section1",
  NewSection: function() {
    var $currentSection = $(this.SectionId);
    this.Section++;
    this.SectionId = "#section" + this.Section.toString();
    $currentSection.before('<div id="section' + this.Section.toString() + '"></div>');
  },
  Write: function(str) {
    $(this.SectionId).append(str);
  },
  WriteLine: function(str) {
    if (str !== undefined && str !== null && str !== "") this.Write(str);
    this.Write("<br/>");
  }
};


var GetMaxNum = function() {
  var result = $("#MaxNumSelect option:selected").val();
  return result;
}

$(document).ready(function() {
  $("#MaxNumSelect").change(function() {
    MaxNum = GetMaxNum();
    Console.NewSection();
    Main();
    Console.WriteLine("---------------------------------");
  });
  Main();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>Select max number:&nbsp;
  <select id="MaxNumSelect">
    <option value="10000" default="default">10000</option>
    <option value="100">100</option>
    <option value="1000">1000</option>
    <option value="100000">100000</option>
  </select>
</div>

<div id="results">
  <div id="section1"></div>
</div>

В приведенном выше примере мы протестировали первые 10000 натуральных чисел. Чтобы решить, является ли данное число простым числом, вы просто проверяете, содержится ли оно в массиве prim:

function Is_prime(n) {
    if (n>MaxNum) throw "ERROR: n must be <"+CalcToNum+"!";
    if (prim.indexOf(n)===-1)
      return false;
    else
      return true;
};

Пример: alert(Is_prime(25)); - возвращает false, потому что 25 не простое число.

Примечание: диапазон номеров должен быть проверен, потому что функция Is_prime может решить только для чисел, которые были ранее проверены на сите выше.

Вы должны вернуть bool Значение и новая функция могут быть:

function(n) {
    if(n === 1) { return false;}
    else if(n == 2) { return true;}
    else if(n == 3) { return true;}
    else { 
        for(i=Math.floor(Math.sqrt(n));i>=2;i--){
            //console.log(i);//maybe another var in here? 
                if(n%i ==0 || n%2 ==0 || n%3 == 0) {return false;} 
        } 
        }
    return true;
};

В ОП контроль if(n%i !==0 && n%2 !==0 && n%3 !== 0) {return n;} было проблематично, потому что даже если только один i удовлетворяет этому условию, функция возвращает число как простое число.

Попробуйте приведенный ниже код. Он проверяет, является ли число простым, и если нет, он регистрирует наименьший делитель числа. Это верно для чисел, состоящих менее чем из 17 цифр (теоретически это будет работать для любого числа, но способ работы JavaScript означает, что это не так). Вы можете попробовать его встроенным в веб-сайт здесь: https://prime-number-checker-git-main.matt-destroyer.vercel.app/ Или во фрагменте ниже.

         function check() {
    function checkIfPrime(number) {
        if (number < 1) {
            i = 'less than zero or the number you entered was zero';
            return false;
        } else if (number < 2) {
            i = 'itself only';
            return false;
        } else if (number < 4) {
            return true;
        } else if (number < 10) {
            if (number === 4) {
                i = 2;
                return false;
            } else if (number === 5) {
                return true;
            } else if (number === 6) {
                i = 2;
                return false;
            } else if (number === 7) {
                return true;
            } else if (number === 8) {
                i = 2;
                return false;
            } else if (number === 9) {
                i = 3;
                return false;
            } 
        } else if (number % 2 === 0) {
            i = 2;
            return false;
        } else if (number % 3 === 0) {
            i = 3;
            return false;
        } else if (number % 5 === 0) {
            i = 5;
            return false;
        } else if (number % 7 === 0) {
            i = 7;
            return false;
        } else {
            i = 4;
            while (i * i < number) {
                if (number % i === 0) {
                    return false;
                }
                i += 2;
            }
            return true;
        }
    }
    let i = 0;
    let input = parseInt(prompt('Enter a number to check if it is prime:'));
    if (input < 0) {
        alert(input + ' is not a prime number. A prime number must be a positive integer.');
    } else if (input === "") {
        alert("You cannot check if 'BLANK' is prime.");
    } else if (input != Math.round(input)) {
        alert(input + ' is not a prime number. A prime number cannot be a decimal.');
    } else {
        let check = checkIfPrime(input);
        if (check === true) {
            alert(input + ' is a prime number.');
        } else {
            alert(input + ' is not a prime number. Its lowest divisor is ' + i + '.');
        }
    }
}
check();

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

          function primeNum (x){
    const primeArray =[];

    for (var i = 1 ; i <= x ; i++){
        if (x % i === 0){
            primeArray.push(i)
        }
    }

    if (primeArray.length === 2){
        return "it's a prime boys"
    } else {
        return "it's not a prime sorry to say"
    }
}

концепция проста, простое число - это число, которое может делиться только на 2 числа и имеет модуль, равный 0 ( x % i === 0). Итак, если primeArrayимеет длину более 2 (более 2 чисел), это не простое число.

Я не знаю, что люди говорят о моем коде, мне нужен ваш совет, ребята. С уважением.

В вашем заявлении, если вы получили

if(n%i !==0 && n%2 !==0 && n%3 !== 0)

цикл for выполняется до i >= 2, поэтому n%2!== 0 бесполезно, когда i = 2, ваш if будет выглядеть так:

if(n%2 !==0 && n%2 !==0 && n%3 !== 0)

Это 2 раза та же самая проверка, то же самое для n%3, это уже проверено:).

Вы должны держать bool, чтобы проверить n%i!== 0, если оно никогда не достигнет этого, это простое число.

Удачи с домашней работой:).

Это должно помочь

//just saw that this only works for prime numbers not larger than 100
var num = 100;
function PrimeNum(num){
 var P = [2, 3, 5, 7];
    for (var i=8; i<=num; i++){
        if (i%P[0]!==0 && i%P[1]!==0 && i%P[2]!==0 && i%P[3]!==0){
            P.push(i);
        }
    }
    console.log(P);
}
PrimeNum(num);
function isPrime(number) {

  // Immediate exit cases
  switch(true){
    case (number < 2):
      return console.log("Please enter a number greater than or equal to 2.")
    case (number === 2 || number === 3):
      return console.log(number + " is a prime number!")
  }

  // Process number if it does not meet above requirements
  var num = Math.floor(Math.sqrt(number))

  for(var i = 2; i <= num; i++) {
    if(number % i === 0)
      return console.log(number + " is not a prime number")
    else
      return console.log(number + " is a prime number!")
  } 
}

isPrime(27) // 27 is a prime number!
isPrime(30) // 30 is not a prime number
isPrime(55) // 55 is a prime number!
isPrime(2)  // 2 is a prime number!

Это мой ответ!

var isPrime = function (n) {
  if (n<2) {
    return false
  }else if (n = 2) {
    return true
  }
  for (var i = 2; i < n; i++) {
    if (n%i === 0) {
      return false
    }else if (i === n-1) {
      return true
    }
  }
}
console.log(isPrime(7));

Хотите узнать, как определить число простое или составное. Этот код поможет вам легко понять. Ввод с номера 2.

var p = prompt("Insert a number for check","");
var x = " is a prime number";
for(i=2; i<p; i++){
    if(p%i === 0){
        x = " is a composite number";
        break;
    }
}
alert(p+x);
Другие вопросы по тегам