簡體   English   中英

質數 JavaScript

[英]Prime Numbers 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 !!!   
        } 
    }
};

基於此頁面,這將是一種確定數字是否為素數的方法:

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 到 100.000 之間的質數大約需要 250 毫秒。

也可以看看 ...

[編輯八月。 2021 ] 一個更有效的功能。 看到這個 Stackblitz 項目

 document.querySelector(`pre`).textContent = `Prime numbers < 100\n` + [...Array(100)] .map((v, i) => isPrime(i) ? i : 0) .filter(v => v > 0) .join(`\n`); function isPrime(number) { const checkPrime = (nr, limit) => { for (let start = 3; start <= limit; start += 2) { if (0 === nr % start) { return false; } } return nr > 1; }; return number === 2 || number % 2 !== 0 && checkPrime(number, Math.sqrt(number)); }
 <pre></pre>

這是在 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 ]

它非常快,因為:

  • 它將循環限制對齊為整數;
  • 它使用較短的迭代循環,跳過偶數。

它可以在大約 130 毫秒內為您提供前 100,000 個素數,或在大約 4 秒內為您提供前 1m 個素數。

2021 更新

在這個時代,我們應該為此使用ES6 生成器

// generates "n" primes that follow "startPrime";
function* nextPrimes(startPrime, n) {
    let value = startPrime, i = 0;
    while (i++ < n) {
        if (value > 2) {
            let k, q;
            do {
                k = 3;
                value += 2;
                q = Math.floor(Math.sqrt(value));
                while (k <= q && value % k) {
                    k += 2;
                }
            } while (k <= q);
        } else {
            value = value === 2 ? 3 : 2;
        }
        yield value;
    }
}

測試:

const result = [...nextPrimes(1, 10)];
//=> [2,  3,  5,  7, 11, 13, 17, 19, 23, 29]

 function* nextPrimes(startPrime, n) { let value = startPrime, i = 0; while (i++ < n) { if (value > 2) { let k, q; do { k = 3; value += 2; q = Math.floor(Math.sqrt(value)); while (k <= q && value % k) { k += 2; } } while (k <= q); } else { value = value === 2 ? 3 : 2; } yield value; } } const result = [...nextPrimes(1, 10)]; 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>

這是一個簡單的素數“篩子”,很容易理解,雖然它是一種幼稚的方法(與復雜的高效素數測試如AKS 測試相反),但它非常快(在 < 1 中測試了 10000 個數字秒)。 它將找到的素數存儲在數組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只能決定先前由上述篩子測試過的數字。 如果數組太小而無法檢查數字(即,如果沒有預先計算足夠的素數),則會引發錯誤。

我在實現中考慮了以下內容:素數是“自然數” ,負值可能是素數 這是一個更明確的輸入衛生解決方案:

 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; } var maxFactorNum = Math.sqrt(num); for (var i = 2; i <= maxFactorNum; i++) { if (num % i === 0) { return false; } } return true; } //this method in action for (var 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"));

我希望我的答案被證明是更易讀的代碼,也使用了最佳實踐。 例如,一些答案將平方根計算留在循環中,導致該方法在每個循環上運行該計算。

您應該返回一個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;
};

在 OP 中,控制if(n%i !==0 && n%2 !==0 && n%3 !== 0) {return n;}是有問題的,因為即使只有單個i滿足此條件,函數將數字作為素數返回。

在你的 if 語句中,你得到了

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 也是如此,它已經檢查過:)。

您應該保留一個布爾值來檢查 n%i !== 0,如果它從未達到此值,則它是一個素數。

祝你功課好運:)。

這是我的答案

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

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!

試試下面的代碼。 它檢查數字是否為素數,如果不是,則記錄該數字的最低除數。 它對於少於 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 % 2 === 0) { i = 2; return false; } else if (number < 10) { if (number === 3) { return true; } else if (number === 5) { return true; } else if (number === 7) { return true; }else if (number === 9) { i = 3; 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 個數字),則它不是素數。

我不知道人們對我的代碼有什么看法,我需要你們的建議。 此致。

你想知道如何判斷一個數是素數還是合數。 這段代碼讓你很容易理解。 從數字 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM