有人可以告诉我这里获得笨蛋的指导吗?这是家庭作业,所以我不想要答案,但一些指针将不胜感激。这真让我烦恼:(
我想我很亲密。但是我遇到的问题是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 !!!
}
}
};
答案 0 :(得分:17)
基于this page,这将是一种确定数字是否为素数的方法:
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之间的素数需要大约250M。
答案 1 :(得分:6)
这是基于之前的素数价值计算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秒内为您提供前1个素数。
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>"
);
}
&#13;
答案 2 :(得分:3)
如果数字为素数,则有一个函数返回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>
答案 3 :(得分:1)
这是一个简单&#34;筛子&#34;对于素数,,这很容易理解,虽然它是一个天真的方法(与复杂的有效素数测试相对,如AKS test),它很漂亮快速(在<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();
});
&#13;
<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>
&#13;
在上面的例子中,我们测试了前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
只能决定之前由筛子测试的数字。如果数组太小而无法检查数字(即如果预先计算的素数不够),则会引发错误。
答案 4 :(得分:1)
我在实现中考虑了以下内容:Prime numbers are "natural numbers"和it is possible for negative values to be prime numbers。这是使用输入卫生的更为确定的解决方案:
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"));
我希望我的答案能被证明是使用了最佳实践的更具可读性的代码。例如,一些答案将平方根计算留在循环中,导致该方法在每个循环上运行该计算。
答案 5 :(得分:0)
您应该返回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
满足此条件,该函数也会将该数字作为素数返回。
答案 6 :(得分:0)
在你的if语句中
if(n%i !==0 && n%2 !==0 && n%3 !== 0)
你的循环一直持续到i> = 2,所以n%2!== 0没用,当i = 2时,你的if会是这样的:
if(n%2 !==0 && n%2 !==0 && n%3 !== 0)
这是相同的2倍,同样是n%3,它已经检查过了:)。
你应该保持一个布尔来检查n%i!== 0,如果它永远不会到达这是一个素数。
祝你的作业好运:)。
答案 7 :(得分:0)
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!
答案 8 :(得分:0)
尝试以下代码。它检查数字是否为质数,如果不是,则记录数字的最小除数。小于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();
答案 9 :(得分:-1)
这是我的答案!
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));
&#13;
答案 10 :(得分:-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);