如果数字是JavaScript中的质数,则获取布尔值
我试图解决这个问题,我需要在控制台上打印true或false,如果一个数字是素数,则打印true;如果不是素数,则打印false。我似乎有解决方案,但我知道在某个地方有一个错误,因为如果我改变2个isPrime变量的布尔值,我会得到不同的答案 问题是: 如果num是prime,则返回true,否则返回false 提示:素数只能被它自身和1整除 提示2:您可以使用for循环解决此问题 注:0和1不被视为素数 输入示例: 一, 7. 11 15 二十 输出示例: 假的 符合事实的 符合事实的 错误的 假的 我的代码:如果数字是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 二十 输出示例: 假的 符合事实的 符合事实的 错误的
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语句。其中的代码可以在没有大括号的情况下执行。这里有一些例子: