我正在尝试解决这个问题,我需要根据数字在控制台上打印 true 或 false(如果数字是质数则为 true,否则为 false)。我似乎找到了解决方案,但我知道某处存在错误,因为如果更改 2 个 isPrime 变量的 bool 值,我会得到不同的答案。
问题如下: 如果 num 是质数则返回 true,否则返回 false。
提示:质数只能被其自身和 1 整除 提示 2:您可以使用 for 循环解决此问题。
注意:0 和 1 不被视为质数
输入示例:
1 7 11 15 20
输出示例:
假的 真的 真的 错误的 假的
我的代码:
function isPrime(num){
let isPrime = '';
for(let i = 2; i <= Math.sqrt(num); i++){
if(num % i === 0){
isPrime = false;
} else {
isPrime = true;
}
}
return isPrime;
}
isPrime(11);
最佳答案
你们很亲近。我将建立在您的解决方案之上。一旦检测到数字不是质数,就需要返回 false。这避免了我们进行额外的冗余计算。
您也没有考虑到第一个提示。
Hint - Note: 0 and 1 are NOT considered prime numbers
为此,如果数字为 0 或 1,您可以简单地返回 false
。
function isPrime(num) {
if (num === 0 || num === 1) return false;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) return false;
}
return true;
}
同样在您的代码中,您使用变量 isPrime 来跟踪 bool 值,同时使用空字符串对其进行初始化。这是不正确的。 Javascript 允许这样做,因为它是弱类型的,但这是一种误导。所以将来如果你为 bool 值定义一个变量,不要用字符串初始化它;)
进一步处理您的评论。如果您确实想坚持在代码中使用标志,则可以使用 true 而不是空字符串来初始化 isPrime。
这样你就可以摆脱 for 循环中的 else 部分,从而使代码更短。我使用了 @Commercial Suicide 提供的代码(顺便说一句,他确实说有更优雅的解决方案)作为示例:
function isPrime(num) {
let flag = true;
let isPrime = true;
if (num === 0 || num === 1) return false;
if (num === 2) return true;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (flag) {
if(num % i === 0) {
isPrime = false;
flag = false;
}
}
}
return isPrime;
}
const numbers = [1, 7, 11, 15, 20];
const booleans = [false, true, true, false, false];
numbers.forEach((item, i) => {
if (isPrime(item) === booleans[i]) {
console.log("CORRECT");
} else {
console.log("WRONG");
}
})
然后您可以更进一步,删除 flag 变量。
function isPrime(num) {
let isPrime = true;
if (num === 0 || num === 1) return false;
if (num === 2) return true;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (isPrime) {
if(num % i === 0) {
isPrime = false;
} else {
isPrime = true;
}
}
}
return isPrime;
}
但现在应该更加清楚,正如我最初指出的那样,这些标志实际上是多余的。只要检测到数字不是质数,就立即返回 false 以避免进一步不必要的循环运行。从我多年来使用 JavaScript 的经验来看,我可以看出我们正在走向函数式编程的思维方式。它通常有助于避免变量突变。
关于javascript - 如果数字是 JavaScript 中的质数,则获取 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480882/