我正在尝试解决这个问题,我需要在控制台上根据数字打印true或false(如果数字为Prime则为true,否则为false)。我似乎有解决方案,但我知道某处有错误,因为如果我更改2个isPrime变量的布尔值,我会得到不同的答案。
以下是问题: 如果num为prime,则返回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);
答案 0 :(得分:2)
你非常接近。我将建立在您的解决方案之上。一旦检测到该数字不是素数,您就需要返回 false 。这避免了我们进行额外的冗余计算。
你也没有考虑到第一个提示。
提示 - 注意:0和1不被视为素数
为此,如果数字为0或1,您只需return 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 来跟踪布尔值,同时使用空字符串初始化它。这是不正确的。 Javascript允许这样做,因为它的类型很弱,但这是误导性的。因此,将来如果为布尔值定义变量,请不要用字符串初始化它;)
进一步解决您的意见。如果您确实希望坚持在代码中使用标记,那么您可以使用 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");
}
})
&#13;
然后您可以更进一步,删除标记变量。
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方面的经验,我可以看到我们正朝着功能性编程思维方向发展。它通常有助于避免变异突变。
答案 1 :(得分:2)
这是因为你的isPrime
变量可以多次覆盖,简单的标志(例如)会阻止这个问题。我还添加了0,1和2的检查。有更优雅的方法可以做到这一点,但我想保留你的逻辑,这里有一些测试的例子:
function isPrime(num) {
let flag = true;
let isPrime = '';
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;
} else {
isPrime = true;
}
}
}
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");
}
})
&#13;