[英]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 個素數。
在這個時代,我們應該為此使用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: <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.