Prime Numbers JavaScript

时间:2013-06-30 10:20:16

标签: javascript numbers

有人可以告诉我这里获得笨蛋的指导吗?这是家庭作业,所以我不想要答案,但一些指针将不胜感激。这真让我烦恼:(

我想我很亲密。但是我遇到的问题是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 !!!   
        } 
    }
};

11 个答案:

答案 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。

See also ...

答案 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个素数。

&#13;
&#13;
    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;
&#13;
&#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开始就不能再进一步了甚至素数。

&#13;
&#13;
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:&nbsp;
  <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;
&#13;
&#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)

这是我的答案!

&#13;
&#13;
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;
&#13;
&#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);