如果数字是JavaScript中的质数,则获取布尔值

如果数字是JavaScript中的质数,则获取布尔值,javascript,function,if-statement,Javascript,Function,If Statement,我试图解决这个问题,我需要在控制台上打印true或false,如果一个数字是素数,则打印true;如果不是素数,则打印false。我似乎有解决方案,但我知道在某个地方有一个错误,因为如果我改变2个isPrime变量的布尔值,我会得到不同的答案 问题是: 如果num是prime,则返回true,否则返回false 提示:素数只能被它自身和1整除 提示2:您可以使用for循环解决此问题 注:0和1不被视为素数 输入示例: 一, 7. 11 15 二十 输出示例: 假的 符合事实的 符合事实的 错误的

我试图解决这个问题,我需要在控制台上打印true或false,如果一个数字是素数,则打印true;如果不是素数,则打印false。我似乎有解决方案,但我知道在某个地方有一个错误,因为如果我改变2个isPrime变量的布尔值,我会得到不同的答案

问题是: 如果num是prime,则返回true,否则返回false

提示:素数只能被它自身和1整除 提示2:您可以使用for循环解决此问题

注:0和1不被视为素数

输入示例:

一, 7. 11 15 二十

输出示例:

假的 符合事实的 符合事实的 错误的 假的

我的代码:

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。这避免了我们进行额外的冗余计算

您也没有考虑第一个提示

提示-注意:0和1不被视为素数

为此,若数字为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跟踪布尔值,同时使用空字符串初始化它。这是不对的。Javascript允许这样做,因为它是弱类型的,但这是误导性的。所以在将来,如果你为布尔值定义一个变量,不要用字符串初始化它

进一步回应你的评论。如果您确实希望在代码中保留一个标志,那么可以使用true而不是空字符串初始化isPrime

这样,就可以去掉for循环中的else部分,从而缩短代码。我使用了@Commercial sequestion提供的代码,他确实说过有更优雅的解决方案作为例子:

函数isPrimenum{ 让flag=true; 让isPrime=true; 如果num==0 | | num==1,则返回false; 如果num==2,则返回true; 对于let i=2;i{ 如果isPrimeitem==布尔[i]{ console.logCORRECT; }否则{ 控制台。错误; }
} 你非常接近。我将在你的解决方案的基础上构建。一旦你检测到这个数字不是素数,你就需要返回false。这避免了我们进行额外的冗余计算

您也没有考虑第一个提示

提示-注意:0和1不被视为素数

为此,若数字为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跟踪布尔值。这是不正确的。Javascript允许这样做,因为它是弱类型的,但这会产生误导。因此,将来如果您为布尔值定义变量,请不要使用字符串初始化它

如果你想在代码中保留一个标志,那么你可以用true而不是空字符串初始化isPrime

这样,您就可以去掉for循环中的else部分,使代码更短。我使用了@Commercial sequest提供的代码,他确实说过有更优雅的解决方案作为示例:

函数isPrimenum{ 让flag=true; 让isPrime=true; 如果num==0 | | num==1,则返回false; 如果num==2,则返回true; 对于let i=2;i{ 如果isPrimeitem==布尔[i]{ console.logCORRECT; }否则{ 控制台。错误; } } 这是因为您的isPrime变量可以被多次重写,例如simple flag将防止此问题。我还添加了0、1和2的检查。有更优雅的方法可以做到这一点,但我希望保留您的逻辑,下面是一个带有一些测试的示例:

函数isPrimenum{ 让flag=true; 让isPrime=; 如果num==0 | | num==1,则返回false; 如果num==2,则返回true; 对于let i=2;i{ 如果isPrimeitem==布尔[i]{ console.logCORRECT; }否则{ 控制台。错误; } } 这是因为您的isPrime变量可以被多次重写,例如simple flag将防止此问题。我还添加了0、1和2的检查。有更优雅的方法可以做到这一点,但我希望保留您的逻辑,下面是一个带有一些测试的示例:

函数isPrimenum{ 让flag=true; 让isPrime=; 如果num==0 | | num==1,则返回false; 如果num==2,则返回true; 对于let i=2;i{ 如果isPrimeitem==布尔[i]{ console.logCORRECT; }否则{ 控制台。错误; }
}你能解释一下旗子是做什么的吗?我是一个编程新手,并且尽可能多地自己练习,我还没有遇到旗子。谢谢you@FaizaHusain添加该标志是因为您的isPrime变量可以被多次重写。它所做的只是防止进一步写入您设置为fla的isPrime变量唯一的问题是,即使将该标志设置为false,循环也将继续运行,几乎不做任何事情。也可以使用b来代替该标志
reak停止循环继续运行,或者直接使用return返回素数值。@Antoni4,感谢您的解释。是的,我同意,返回比旗子更优雅。你能解释一下旗子的作用吗?我是一个编程新手,并试图尽可能多地自己练习,但我还没有遇到过这种情况。感谢you@FaizaHusain添加该标志是因为可以多次重写isPrime变量。它所做的只是防止进一步写入变量isPrime,即您将标志设置为false的变量。唯一的问题是,即使将该标志设置为false,循环也将继续运行,几乎什么也不做。您也可以使用break来停止循环的进一步运行,或者直接使用return返回素数值。@Antoni4,谢谢您的解释。是的,我同意,return会比flag更优雅,所以我可以把这个变量留给boolean空白?比如:var isPrime?我可以把不想赋值的其他变量也留空吗?还有,为什么IF语句没有大括号{}?它们的缺失不应该导致错误吗?如果您将变量留空,它将是未定义的。在布尔值的情况下,它将与false相同,因为undefined是false。您可以在这里找到falsy值列表:这称为内联if语句。其中的代码可以在没有大括号的情况下执行。这里有一些例子:所以我可以把布尔值的变量留空?比如:var isPrime?我可以把不想赋值的其他变量也留空吗?还有,为什么IF语句没有大括号{}?它们的缺失不应该导致错误吗?如果您将变量留空,它将是未定义的。在布尔值的情况下,它将与false相同,因为undefined是false。您可以在这里找到falsy值列表:这称为内联if语句。其中的代码可以在没有大括号的情况下执行。这里有一些例子: