web-dev-qa-db-fra.com

Premiers nombres JavaScript

Quelqu'un peut-il s'il vous plaît me donner des conseils pour obtenir les premiers numéros ici? Ce sont des devoirs donc je ne veux pas de réponse, mais des indications seraient grandement appréciées. C'est vraiment ennuyeux moi :( 

Je pense que je suis proche. Mais ces problèmes que je pose sont les numéros 25 et 35. Ils ne sont pas premiers, mais cette fonction les renvoie

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 !!!   
        } 
    }
};
11
HattrickNZ

Sur la base de cette page , ce serait une méthode pour déterminer si un nombre est un nombre premier:

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

En node.js, il faut environ 250Ms pour déterminer les nombres premiers compris entre 2 et 100.000.

Voir aussi ...

17
KooiInc

Voici le moyen le plus rapide de calculer les nombres premiers en JavaScript, en fonction de la valeur principale précédente.

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;
}

Tester

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

Sortie

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

C'est très rapide car:

  • Il aligne la limite de la boucle sur un entier.
  • Il utilise une boucle d'itération plus courte, en sautant des nombres pairs.

Il peut vous donner les 100 000 premiers nombres premiers en environ 130 ms ou les 1 m en 4 secondes.

    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>"
        );
    }

6
vitaly-t

Il y a une fonction qui retournera true si le nombre est premier et false si ce n'est pas le cas:

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

Consultez la démo: 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>

3
SaidbakR

Voici un simple "tamis" pour les nombres premiers, qui peut être facilement compris, et même s’il s’agit d’un approche naïve (par opposition à des tests sophistiqués et efficaces tels que le Test AKS ), il est assez rapide (10000 nombres testés en <1 sec). Il stocke les nombres premiers trouvés dans le tableau prim[] et teste à l'aide de la fonction modulo (%): 

La boucle teste par rapport aux nombres premiers déjà trouvés et se termine si elle est pas de nombre premier, c'est-à-dire si le résultat modulo est 0 (vis-à-vis de l'expression i % prim[j])===0). Sinon, il l'ajoute à la liste des nombres premiers trouvés.

Notez que parce que le seul nombre premier pair est 2, le le pas de la boucle est 2 plutôt que 1, car à partir de 3, il ne peut plus y avoir de nombres premiers pairs.

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>

Dans l'exemple ci-dessus, nous avons testé les 10 000 premiers nombres naturels. Pour décider si un nombre donné est un nombre premier, il vous suffit de vérifier s'il est contenu dans le tableau prim:

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

Exemple:alert(Is_prime(25)); - renvoie false, car 25 n'est pas un nombre premier.

Remarque: La plage de numéros doit être vérifiée, car la fonction Is_prime ne peut décider que pour les numéros précédemment testés par le tamis ci-dessus.

1
Matt

Vous devriez renvoyer une valeur bool et la nouvelle fonction peut être:

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;
};

Dans l'OP, la commande if(n%i !==0 && n%2 !==0 && n%3 !== 0) {return n;} posait problème, car même si seul i satisfait à cette condition, la fonction renvoie le nombre sous la forme d'un nombre premier.

0
fatihk

Ceci est ma réponse!

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));

0
Microsmsm

Dans votre déclaration si vous avez

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

vous faites une boucle jusqu'à ce que i> = 2, donc le n% 2! == 0 est inutile, quand i = 2, votre si ressemblerait à ceci:

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

C’est 2x la même vérification, la même chose est valable pour n% 3, c’est déjà vérifié :).

vous devriez garder une valeur booléenne pour vérifier le n% i! == 0, s'il n'atteint jamais ce chiffre, il est primordial. 

Bonne chance avec tes devoirs :).

0
Bjorn

Voici une solution plus définitive avec un assainissement d’entrée. Les nombres premiers sont des "nombres naturels" et il est possible que les valeurs négatives soient des nombres premiers .

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"));

J'espère que ma réponse se révélera être un code plus lisible, utilisant également les meilleures pratiques. Par exemple, certaines réponses laissent le calcul de la racine carrée dans la boucle, ce qui obligera la méthode à exécuter ce calcul sur chaque boucle.

0
lewdev
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!
0
Dan Zuzevich