61

在 Javascript 中,我如何找到 0 - 100 之间的素数?我已经考虑过了,但我不知道如何找到它们。我想过做 x % x 但我发现了明显的问题。这是我到目前为止所拥有的:但不幸的是,这是有史以来最糟糕的代码。

var prime = function (){
var num;
for (num = 0; num < 101; num++){
    if (num % 2 === 0){
        break;
    }
    else if (num % 3 === 0){
        break;
    }
    else if (num % 4=== 0){
        break;
    }
    else if (num % 5 === 0){
        break;
    }
    else if (num % 6 === 0){
        break;
    }
    else if (num % 7 === 0){
        break;
    }
    else if (num % 8 === 0){
        break;
    }
    else if (num % 9 === 0){
        break;
    }
    else if (num % 10 === 0){
        break;
    }
    else if (num % 11 === 0){
        break;
    }
    else if (num % 12 === 0){
        break;
    }
    else {
        return num;
    }
}
};
console.log(prime());
4

40 回答 40

84

下面是一个在 JavaScript 中实现筛子的例子:

function getPrimes(max) {
    var sieve = [], i, j, primes = [];
    for (i = 2; i <= max; ++i) {
        if (!sieve[i]) {
            // i has not been marked -- it is prime
            primes.push(i);
            for (j = i << 1; j <= max; j += i) {
                sieve[j] = true;
            }
        }
    }
    return primes;
}

然后getPrimes(100)将返回 2 到 100(含)之间的所有素数的数组。当然,由于内存限制,您不能将其与大参数一起使用。

Java 实现看起来非常相似。

于 2012-09-05T18:26:38.017 回答
58

这是我解决它的方法。将它从 Java 重写为 JavaScript,如果有语法错误,请见谅。

function isPrime (n)
{
    if (n < 2) return false;

    /**
     * An integer is prime if it is not divisible by any prime less than or equal to its square root
     **/

    var q = Math.floor(Math.sqrt(n));

    for (var i = 2; i <= q; i++)
    {
        if (n % i == 0)
        {
            return false;
        }
    }

    return true;
}

一个数 ,n如果它不能被除 1 和它本身之外的任何其他数整除,那么它就是质数。此外,检查数字 [2, sqrt(n)] 就足够了。

于 2012-08-15T10:15:55.183 回答
32

这是该脚本的现场演示:http: //jsfiddle.net/K2QJp/

首先,创建一个函数来测试单个数字是否为素数。如果你想扩展 Number 对象,你可以,但我决定让代码尽可能简单。

function isPrime(num) {
    if(num < 2) return false;
    for (var i = 2; i < num; i++) {
        if(num%i==0)
            return false;
    }
    return true;
}

该脚本遍历比该数字小 2 到 1 之间的每个数字,并测试如果您将该数字除以增量,是否有任何数字没有余数。如果有任何没有余数,它就不是素数。如果数字小于 2,则它不是质数。否则,它是素数。

然后创建一个 for 循环来遍历数字 0 到 100 并使用该函数测试每个数字。如果是素数,则将数字输出到日志中。

for(var i = 0; i < 100; i++){
    if(isPrime(i)) console.log(i);
}
于 2012-08-15T09:15:09.667 回答
12

无论使用哪种语言,在一个范围内寻找素数的最好和最容易获得的方法之一就是使用sieve

不会给你代码,但这是一个很好的起点。

对于像您这样的小范围,最有效的方法是预先计算数字。

于 2012-08-15T09:00:01.927 回答
12

我稍微修改了Sundaram算法的 Sieve 以减少不必要的迭代,它似乎非常快。

这个算法实际上比这个主题下最被接受的@Ted Hopp 的解决方案快两倍。解决 0 - 1M 之间的 78498 个素数在 Chrome 55 中需要 20~25 毫秒,在 FF 50.1 中需要 < 90 毫秒。@ vitaly -t 的获取下一个素数算法看起来很有趣,但结果也慢得多。

这是核心算法。可以应用分段和线程来获得极好的结果。

"use strict";
function primeSieve(n){
  var a = Array(n = n/2),
      t = (Math.sqrt(4+8*n)-2)/4,
      u = 0,
      r = [];
  for(var i = 1; i <= t; i++){
    u = (n-i)/(1+2*i);
    for(var j = i; j <= u; j++) a[i + j + 2*i*j] = true;
  }
  for(var i = 0; i<= n; i++) !a[i] && r.push(i*2+1);
  return r;
}

var primes = [];
console.time("primes");
primes = primeSieve(1000000);
console.timeEnd("primes");
console.log(primes.length);

循环限制解释:

就像 Erasthotenes 筛法一样,Sundaram 筛法算法也会从列表中删除一些选定的整数。选择哪些整数要划掉规则是 i + j + 2ij ≤ n 其中 i 和 j 是两个索引,n 是总元素的数量。一旦我们划掉每一个 i + j + 2ij,剩下的数字就会加倍并奇数化 (2n+1) 以显示素数列表。最后阶段实际上是偶数的自动折扣。它的证明在这里得到了很好的解释。

仅当正确选择循环索引开始和结束限制以使不存在(或最小)冗余(多次)消除非素数时,Sundaram 的筛选才会快。因为我们需要 i 和 j 值来计算要删除的数字,所以 i + j + 2ij 直到 n 让我们看看我们如何接近。

i)所以我们必须找到 i 和 j 相等时可以取的最大值。即 2i + 2i^2 = n。我们可以通过使用二次公式轻松求解 i 的正值,即t = (Math.sqrt(4+8*n)-2)/4,

j)内部循环索引 j 应该从 i 开始并一直运行到它可以与当前 i 值一起运行的点。仅此而已。由于我们知道 i + j + 2ij = n,这可以很容易地计算为u = (n-i)/(1+2*i);

虽然这不会完全消除冗余交叉点,但它将“大大”消除冗余。例如,对于 n = 50(检查最大为 100 的素数)而不是执行 50 x 50 = 2500,我们总共只执行 30 次迭代。很明显,这个算法不应该被认为是一个 O(n^2) 时间复杂度的算法。

i  j  v
1  1  4
1  2  7
1  3 10
1  4 13
1  5 16
1  6 19
1  7 22  <<
1  8 25
1  9 28
1 10 31  <<
1 11 34
1 12 37  <<
1 13 40  <<
1 14 43
1 15 46
1 16 49  <<
2  2 12
2  3 17
2  4 22  << dupe #1
2  5 27
2  6 32
2  7 37  << dupe #2
2  8 42
2  9 47
3  3 24
3  4 31  << dupe #3
3  5 38
3  6 45
4  4 40  << dupe #4
4  5 49  << dupe #5

其中只有5个重复。22、31、37、40、49。对于 n = 100,冗余度约为 20%,但对于 n = 10M,它增加到 ~300%。这意味着进一步优化 SoS 有可能随着 n 的增长更快地获得结果。因此,一个想法可能是分段并始终保持 n 小。

所以好吧..我决定把这个任务更进一步。

经过对反复交叉的一些仔细检查后,我意识到,除案例外,如果or索引值中i === 1的一个或两个在 4、7、10、13、16、19 之间。 .series,生成一个重复的交叉。然后只在 时允许内循环转动,从而实现循环总数进一步减少 35-40%。因此,例如对于 1M 整数,嵌套循环的总转数从 1.4M 下降到 1M。哇..!我们在这里谈论的几乎是 O(n)。iji%3-1 !== 0

我刚刚做了一个测试。在 JS 中,一个空循环计数到 1B 就需要 4000 毫秒。在以下修改后的算法中,找到高达 100M 的素数需要相同的时间。

我还实现了该算法的分段部分以推送给工人。这样我们也可以使用多个线程。但是该代码稍后会出现。

因此,让我向您介绍修改后​​的 Sundaram 筛子,它可能在不分段时处于最佳状态。它将使用 Chrome V8 和 Edge ChakraCore 在大约 15-20 毫秒内计算 0-1M 之间的素数。

"use strict";
function primeSieve(n){
  var a = Array(n = n/2),
      t = (Math.sqrt(4+8*n)-2)/4,
      u = 0,
      r = [];
  for(var i = 1; i < (n-1)/3; i++) a[1+3*i] = true;
  for(var i = 2; i <= t; i++){
    u = (n-i)/(1+2*i);
    if (i%3-1) for(var j = i; j < u; j++) a[i + j + 2*i*j] = true;
  }
  for(var i = 0; i< n; i++) !a[i] && r.push(i*2+1);
  return r;
}

var primes = [];
console.time("primes");
primes = primeSieve(1000000);
console.timeEnd("primes");
console.log(primes.length);

嗯......最后我想我已经实现了一个筛子(它起源于 Sundaram 的巧妙筛子),它是我可以在互联网上找到的最快的 JavaScript 筛子,包括“Eratosthenes 的 Odds only Sieve”或“阿特金斯筛”。这也为网络工作者、多线程做好了准备。

这样想。在这台用于单线程的简陋 AMD PC 中,JS 需要 3,300 毫秒才能计数到 10^9,以下优化的分段 SoS 将在 14,000 毫秒内为我提供高达 10^9 的 50847534 个素数。这意味着只是计数的 4.25 倍。我认为这令人印象深刻。

你可以自己测试一下;

console.time("tare");
for (var i = 0; i < 1000000000; i++);
console.timeEnd("tare");

在这里,我向您介绍了 Sundaram 的分段 Seieve。

"use strict";
function findPrimes(n){
  
  function primeSieve(g,o,r){
    var t = (Math.sqrt(4+8*(g+o))-2)/4,
        e = 0,
        s = 0;
    
    ar.fill(true);
    if (o) {
      for(var i = Math.ceil((o-1)/3); i < (g+o-1)/3; i++) ar[1+3*i-o] = false;
      for(var i = 2; i < t; i++){
        s = Math.ceil((o-i)/(1+2*i));
        e = (g+o-i)/(1+2*i);
        if (i%3-1) for(var j = s; j < e; j++) ar[i + j + 2*i*j-o] = false;
      }
    } else {
        for(var i = 1; i < (g-1)/3; i++) ar[1+3*i] = false;
        for(var i = 2; i < t; i++){
          e = (g-i)/(1+2*i);
          if (i%3-1) for(var j = i; j < e; j++) ar[i + j + 2*i*j] = false;
        }
      }
    for(var i = 0; i < g; i++) ar[i] && r.push((i+o)*2+1);
    return r;
  }
  
  var cs = n <= 1e6 ? 7500
                    : n <= 1e7 ? 60000
                               : 100000, // chunk size
      cc = ~~(n/cs),                     // chunk count
      xs = n % cs,                       // excess after last chunk
      ar = Array(cs/2),                  // array used as map
  result = [];
  
  for(var i = 0; i < cc; i++) result = primeSieve(cs/2,i*cs/2,result);
  result = xs ? primeSieve(xs/2,cc*cs/2,result) : result;
  result[0] *=2;
  return result;
}


var primes = [];
console.time("primes");
primes = findPrimes(1000000000);
console.timeEnd("primes");
console.log(primes.length);

我不确定它是否比这更好。我很想听听你的意见。

于 2017-01-02T23:52:51.733 回答
8

如果一个数不能被比该数低的其他素数整除,则该数是素数。

所以这建立了一个primes数组。将每个新的奇数候选n除以现有的primes低于n. 作为一种优化,它不考虑偶数并将前置2作为最后一步。

var primes = [];
for(var n=3;n<=100;n+=2) {
  if(primes.every(function(prime){return n%prime!=0})) {
    primes.push(n);
  }
}
primes.unshift(2);
于 2015-04-14T09:55:58.193 回答
4

求 0 到 n 之间的素数。您只需要检查一个数字 x 是否可以被 0 -(x 的平方根)之间的任何数字整除。如果我们通过 n 并找到 0 和 n 之间的所有素数,逻辑可以实现为 -

  function findPrimeNums(n)
    { 
       var x= 3,j,i=2,
       primeArr=[2],isPrime;
       for (;x<=n;x+=2){
           j = (int) Math.sqrt (x);
           isPrime = true;
           for (i = 2; i <= j; i++)
           {
                if (x % i == 0){
                    isPrime = false;
                    break;
                }
            }
            if(isPrime){
                primeArr.push(x);
            }

        }   

        return primeArr;
    }
于 2014-09-13T12:56:39.007 回答
4
            var n=100;
            var counter = 0;
            var primeNumbers = "Prime Numbers: ";
            for(var i=2; i<=n; ++i)
            {
                counter=0;
                for(var j=2; j<=n; ++j)
                {
                    if(i>=j && i%j == 0)
                    {
                        ++counter;
                    }

                }
                if(counter == 1)
                    {
                        primeNumbers = primeNumbers + i + "  ";
                    }

            }
            console.log(primeNumbers);
于 2018-06-17T04:45:46.777 回答
3

Luchian 的回答为您提供了找到素数的标准技术的链接。

一种效率较低但更简单的方法是将现有代码转换为嵌套循环。观察你除以 2,3,4,5,6 等等......然后把它变成一个循环。

鉴于这是作业,并且作业的目的是帮助您学习基本的编程,一个简单、正确但效率较低的解决方案应该没问题。

于 2012-08-15T09:11:25.473 回答
3

使用递归结合此处的平方根规则,检查一个数字是否为素数:

function isPrime(num){

    // An integer is prime if it is not divisible by any prime less than or equal to its square root
    var squareRoot = parseInt(Math.sqrt(num));
    var primeCountUp = function(divisor){
        if(divisor > squareRoot) {
            // got to a point where the divisor is greater than 
            // the square root, therefore it is prime
            return true;
        }
        else if(num % divisor === 0) {
            // found a result that divides evenly, NOT prime
            return false;
        }
        else {
            // keep counting
            return primeCountUp(++divisor);
        }
    };

    // start @ 2 because everything is divisible by 1
    return primeCountUp(2);

}
于 2013-11-06T18:48:18.700 回答
3

我最近想出了一个单行解决方案,可以在 Scrimba 上完成 JS 挑战(下图)。

ES6+

const getPrimes=num=>Array(num-1).fill().map((e,i)=>2+i).filter((e,i,a)=>a.slice(0,i).every(x=>e%x!==0));

< ES6

function getPrimes(num){return ",".repeat(num).slice(0,-1).split(',').map(function(e,i){return i+1}).filter(function(e){return e>1}).filter(function(x){return ",".repeat(x).slice(0,-1).split(',').map(function(f,j){return j}).filter(function(e){return e>1}).every(function(e){return x%e!==0})})};

这是解释的逻辑:

  1. 首先,该.repeat()函数使用所需数字(100)作为转发器参数,然后将数组映射到索引+1以获得所需数字(在本例中为100)的所有数字的数组。从 0 到该数字 (0-100) 的数字范围。这里正在进行一些字符串拆分和连接魔术。如果您愿意,我很乐意进一步解释这一步。

  2. 我们从数组中排除 0 和 1,因为它们不应该被测试为素数,以免它们给出误报。两者都不是素数。我们.filter()仅使用 > 1 (≥ 2) 的数字来执行此操作。

  3. 现在,我们过滤我们的新数组,其中包含 2 到所需数字 (100) 之间的所有整数,仅用于素数。为了只过滤素数,我们在第一步中使用了一些相同的魔法。我们再次使用.filter()and来创建一个从 2 到新数字数组中的每个值的新数组。对于每个值的新数组,我们检查是否有任何数字 ≥ 2 和 < 该数字是该数字的因数。我们可以使用与模运算符配对的方法来执行此操作,以检查该数字在除以 2 和自身之间的任何值时是否有任何余数。如果每个值都有余数 (.repeat().every()%x%e!==0),从 2 到该数字的所有值都满足条件(但不包括该数字,即:[2,99]),我们可以说该数字是素数。过滤器函数将所有素数返回到最上面的返回值,从而返回介于 2 和传递值之间的素数列表。

例如,使用我在上面添加的这些函数之一,返回以下内容:

getPrimes(100);
// => [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
于 2020-06-16T05:22:17.953 回答
3

你也可以试试这个方法,这个方法很基础但很容易理解:

 var tw = 2, th = 3, fv = 5, se = 7; 

 document.write(tw + "," + th + ","+ fv + "," + se + ",");


for(var n = 0; n <= 100; n++)
{

  if((n % tw !== 0) && (n % th !==0) && (n % fv !==0 ) && (n % se !==0))

  {
      if (n == 1)
      {
          continue;
      }

    document.write(n +",");
  }
}
于 2018-05-06T12:48:52.870 回答
3

这是一种在 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 = 0, 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 秒内为您提供前 1m 个素数。

 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>"
        );
    }

更新

这是一个比这个快 10 倍的解决方案

于 2015-10-01T14:32:00.157 回答
2
<code>
<script language="javascript">
   var n=prompt("Enter User Value")
     var x=1;
       if(n==0 || n==1) x=0;
          for(i=2;i<n;i++)
           {
          if(n%i==0)
       {
     x=0;
     break;
       }
           }
           if(x==1)
             {
                alert(n +" "+" is prime");
             }
             else
             {
                alert(n +" "+" is not prime");
             }


          </script>

于 2013-10-06T20:43:50.347 回答
2

埃拉托色尼筛。它有点外观,但很简单,而且很有效!

function count_prime(arg) {

    arg = typeof arg !== 'undefined' ? arg : 20; //default value
    var list = [2]
    var list2 = [0,1]
    var real_prime = []

    counter = 2
    while (counter < arg ) {
        if (counter % 2 !== 0) {
            list.push(counter)
        }
        counter++
    }

    for (i = 0; i < list.length - 1; i++) {
        var a = list[i]
        for (j = 0; j < list.length - 1; j++) {
            if (list[j] % a === 0 && list[j] !== a) {
                list[j] = false;       // assign false to non-prime numbers
            }
        }
        if (list[i] !== false) { 
            real_prime.push(list[i]);  // save all prime numbers in new array
        }
    }
 }
window.onload=count_prime(100);
于 2014-11-13T11:32:32.087 回答
2

这是我的尝试。

将初始i=0值从 0 更改为您想要的任何值,将第二个i<100从 100 更改为任何值以获得不同范围内的素数。

for(var i=0; i<100000; i++){
    var devisableCount = 2;

    for(var x=0; x<=i/2; x++){
        if (devisableCount > 3) {
            break;
        }
        if(i !== 1 && i !== 0 && i !== x){
            if(i%x === 0){
               devisableCount++;
             }
        }
    }

    if(devisableCount === 3){
        console.log(i);
    }
}

我试过了10000000- 这需要一些时间,但似乎是准确的。

于 2015-05-13T08:50:17.720 回答
2

这是计算给定范围(1到极限)之间素数的非常简单的方法。

简单的解决方案

    public static void getAllPrimeNumbers(int limit) {

        System.out.println("Printing prime number from 1 to " + limit);

        for(int number=2; number<=limit; number++){
            //***print all prime numbers upto limit***
            if(isPrime(number)){
                System.out.println(number);
            }
        }
    }


    public static boolean isPrime(int num) {
        if (num == 0 || num == 1) {
            return false;
        }
        if (num == 2) { 
            return true;
        }

        for (int i = 2; i <= num / 2; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
于 2018-01-10T09:42:54.437 回答
2

而这个来自著名 JS Ninja 的著名代码

var isPrime = n => Array(Math.ceil(Math.sqrt(n)+1)).fill().map((e,i)=>i).slice(2).every(m => n%m);

console.log(Array(100).fill().map((e,i)=>i+1).slice(1).filter(isPrime));
于 2016-06-04T20:42:51.463 回答
2

使用 ES6 的新特性构建的列表,尤其是使用生成器。转到https://codepen.io/arius/pen/wqmzGp用加泰罗尼亚语与我​​的学生一起上课。希望对你有帮助。

function* Primer(max) { 
  const infinite = !max && max !== 0;
  const re = /^.?$|^(..+?)\1+$/; 
  let current = 1;
 
  while (infinite || max-- ) {
      if(!re.test('1'.repeat(current)) == true) yield current;
      current++
  };
};


let [...list] = Primer(100); 
console.log(list);

于 2017-08-21T07:09:41.943 回答
1
  • 如果我们已经尝试删除2 ,为什么还要尝试删除4(和6,8,10,12 ) ?如果我们已经尝试删除3 ,为什么还要尝试删除9?如果11 * 11 = 121大于100 , 为什么要尝试删除11为什么要尝试从2中 删除任何奇数?为什么要尝试删除任何大于2的 偶数呢?



消除死测试,你会得到一个好的代码,测试低于 100的素数。

而且您的代码远非有史以来最糟糕的代码。许多其他人会尝试将100除以99。但是绝对冠军会生成2..96with的所有产品2..96来测试97是否在其中。那个效率低得惊人。

Eratosthenes的筛子当然要好得多,你可以有一个 - 低于100 -没有布尔数组(也没有除法!)

console.log(2)
var m3 = 9, m5 = 25, m7 = 49, i = 3
for( ; i < 100; i += 2 )
{
    if( i != m3 && i != m5 && i != m7) console.log(i)
    else
    {
        if( i == m3 ) m3 += 6
        if( i == m5 ) m5 += 10
        if( i == m7 ) m7 += 14
    }
} "DONE"

这是 Eratosthenes 的筛子,如果我们跳过复合材料 - 这就是这段代码正在做的事情。合成和跳过它们的时间(通过检查相等性)混合到一个时间线中。通常的筛子首先生成复合物并将它们标记在一个数组中,然后扫描该数组。在这里,这两个阶段被合并为一个,以避免使用任何数组(这仅是因为我们提前知道上限的平方根 - 10 - 并且只使用低于它的素数,即3,5,7 - 2的倍数,即偶数,提前隐式跳过)。

换句话说,这是对 Eratosthenes的增量筛选,并且 ,m3形成素数3、57的倍数的隐式优先级队列m5m7

于 2012-08-16T02:22:26.923 回答
1

这是一个使用 JS 生成器的高效、简短的解决方案。JSfiddle

// Consecutive integers
let nats = function* (n) {
    while (true) yield n++
}

// Wrapper generator
let primes = function* () {
    yield* sieve(primes(), nats(2))
}

// The sieve itself; only tests primes up to sqrt(n)
let sieve = function* (pg, ng) {
    yield ng.next().value;
    let n, p = pg.next().value;
    while ((n = ng.next().value) < p * p) yield n;
    yield* sieve(pg, (function* () {
        while (n = ng.next().value) if (n % p) yield n
    })())
}

// Longest prefix of stream where some predicate holds
let take = function* (vs, fn) {
    let nx;
    while (!(nx = vs.next()).done && fn(nx.value)) yield nx.value
}

document.querySelectorAll('dd')[0].textContent =

// Primes smaller than 100
    [...take(primes(), x => x < 100)].join(', ')
<dl>
<dt>Primes under 100</dt>
<dd></dd>
</dl>

于 2020-09-20T23:43:20.343 回答
1

我正在寻找如何找出素数并浏览了上面太长的代码。我为素数找到了一个新的简单解决方案,并使用过滤器添加它们。如果我的代码有任何错误,请建议我,因为我是初学者。

function sumPrimes(num) {

let newNum = [];

for(let i = 2; i <= num; i++) {
newNum.push(i)
}
for(let i in newNum) {

newNum = newNum.filter(item => item == newNum[i] || item % newNum[i] !== 0)
}

return newNum.reduce((a,b) => a+b)
}

sumPrimes(10);
于 2020-07-10T10:36:27.433 回答
1

您可以将其用于任何大小的素数数组。希望这可以帮助

 function prime() {
   var num = 2;

   var body = document.getElementById("solution");

   var len = arguments.length;
   var flag = true;

   for (j = 0; j < len; j++) {

     for (i = num; i < arguments[j]; i++) {

       if (arguments[j] % i == 0) {
         body.innerHTML += arguments[j] + " False <br />";
         flag = false;
         break;

       } else {
         flag = true;

       }

     }
     if (flag) {
       body.innerHTML += arguments[j] + " True <br />";

     }

   }

 }

 var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

 prime.apply(null, data);
<div id="solution">

</div>

于 2016-05-03T09:48:15.010 回答
1
public static void main(String[] args) {
    int m = 100;
    int a[] =new int[m];
    for (int i=2; i<m; i++)
        for (int j=0; j<m; j+=i)
            a[j]++;
    for (int i=0; i<m; i++)
        if (a[i]==1) System.out.println(i);
}
于 2017-09-11T14:44:17.010 回答
1

使用 Eratosthenes 筛,Rosettacode 上的源代码

最快的解决方案:https ://repl.it/@caub/getPrimes-bench

function getPrimes(limit) {
    if (limit < 2) return [];
    var sqrtlmt = limit**.5 - 2;
    var nums = Array.from({length: limit-1}, (_,i)=>i+2);
    for (var i = 0; i <= sqrtlmt; i++) {
        var p = nums[i]
        if (p) {
            for (var j = p * p - 2; j < nums.length; j += p)
                nums[j] = 0;
        }
    }
    return nums.filter(x => x); // return non 0 values
}
document.body.innerHTML = `<pre style="white-space:pre-wrap">${getPrimes(100).join(', ')}</pre>`;

// for fun, this fantasist regexp way (very inefficient):
// Array.from({length:101}, (_,i)=>i).filter(n => n>1&&!/^(oo+)\1+$/.test('o'.repeat(n))

于 2015-10-12T20:05:47.910 回答
1

没有任何循环的版本。对您拥有的任何阵列使用它。IE。,

[1,2,3...100].filter(x=>isPrime(x));
const isPrime = n => {
if(n===1){
return false;
}
if([2,3,5,7].includes(n)){
return true;
}
return n%2!=0 && n%3!=0 && n%5!=0 && n%7!=0;
}
于 2021-02-16T05:09:40.087 回答
1

以下是找到 n 以内的素数的Brute-force iterative方法和方法。Sieve of Eratosthenes就时间复杂度而言,第二种方法的性能优于第一种

暴力迭代

function findPrime(n) {
  var res = [2],
      isNotPrime;

  for (var i = 3; i < n; i++) {
    isNotPrime = res.some(checkDivisorExist);
    if ( !isNotPrime ) {
      res.push(i);
    }
  }

  function checkDivisorExist (j) {
    return i % j === 0;
  }

  return res;
}

埃拉托色尼筛法

function seiveOfErasthones (n) {
  var listOfNum =range(n),
      i = 2;

  // CHeck only until the square of the prime is less than number
  while (i*i < n && i < n) {
    listOfNum = filterMultiples(listOfNum, i);
    i++;
  }

  return listOfNum;


  function range (num) {
    var res = [];
    for (var i = 2; i <= num; i++) {
      res.push(i);
    }
    return res;
  }

  function filterMultiples (list, x) {
    return list.filter(function (item) {
      // Include numbers smaller than x as they are already prime
      return (item <= x) || (item > x && item % x !== 0);
    });
  }
}
于 2016-04-28T19:05:30.993 回答
0

首先,将您的内部代码更改为另一个循环 ( forand while),以便您可以针对不同的值重复相同的代码。

对于您的问题更具体,如果您想知道给定n是否为素数,则需要将其划分为 2 和 sqrt(n) 之间的所有值。如果任何模块为 0,则它不是素数。

如果你想找到所有的素数,你可以加速它并n只通过除以先前找到的素数来检查。加速这个过程的另一种方法是,除了 2 和 3,所有素数都是6*k正或小于 1。

于 2012-08-15T09:05:23.447 回答
0

如果您要使用将在此线程中介绍的任何海量算法,那么您应该学习记住其中的一些算法。

请参阅面试问题:递归生成素数的最快方法是什么?

于 2012-09-05T18:12:53.967 回答
0

这是我的解决方案

//find all prime numbers
function showMePrimeNumbers(start, end){
    var primes = [];
    for(var number = start; number < end; number++){
        var primeNumberDividers = []; //there should only be 2: 1 & number
        for(var divider = 1; divider <= number; divider++){
            if(number % divider === 0){
                primeNumberDividers.push(divider);
            }      
        }
        if(primeNumberDividers.length === 2){
            primes.push(number);
        }
    }
    return primes;
}

console.log(showMePrimeNumbers(1, 100));           
于 2015-03-04T14:51:16.643 回答
0

我为那些不想使用提示方法而只想看到程序打印素数的人修改了 Rinto 的答案。它的工作

for (n = 0; n < 100; n++) {
    var x = 1;
    if (n == 0 || n == 1) x = 0;
    for (i = 2; i < n; i++) {
        if (n % i == 0) {
            x = 0;
            break;
        }
    }
    if (x == 1) {
        // if prime print the numbers 
        document.write(n);
    } else {
        // if not prime print the number do nothing 
    }
}
于 2014-08-28T18:33:34.560 回答
0

使用以下函数找出素数:

function primeNumbers() {
    var p
    var n = document.primeForm.primeText.value
    var d
    var x
    var prime
    var displayAll = 2 + " "
    for (p = 3; p <= n; p = p + 2) {
        x = Math.sqrt(p)
        prime = 1
        for (d = 3; prime && (d <= x); d = d + 2)
        if ((p % d) == 0) prime = 0
        else prime = 1
        if (prime == 1) {
            displayAll = displayAll + p + " "
        }
    }
    document.primeForm.primeArea.value = displayAll
}
于 2012-09-06T17:36:14.857 回答
0

用JS函数检查数字是否为素数

function isPrime(num)
        {
            var flag = true;
            for(var i=2; i<=Math.ceil(num/2); i++)
            {
                if((num%i)==0)
                {
                    flag = false;
                    break;
                }
            }
            return flag;    
        }
于 2014-02-15T09:51:29.380 回答
0

这样的事情怎么样。

next_prime:
for (var i = 2; i < 100; i++){
    for (var e = 2; e < i; e++){
        if (i % e === 0) continue next_prime;
    }
    console.log(i + '<br>');
}
于 2015-02-05T01:07:37.713 回答
0

这是一种测试数字是否为素数的方法。

function isPrime(numb){
  if (numb % 2 == 0) return false;
  for (var i=3; i<= Math.sqrt(numb); i = i + 2) {
    if (numb % i == 0) {
     return false;
    }
  }
  return true;
}
于 2014-08-12T20:11:29.347 回答
0

我创建了一个 JSFiddle,展示了它应该如何以可读的方式工作,

想法是有两个函数 isPrime 和 getPrimeNumbers 来分离功能,以及使用 Math.pow 和初始值 2,因为它应该始终存在,请参阅 jsfiddle 附加的jsFiddle

window.onload = function() {
  (function() {
    var cont = document.getElementById('MainContainer');
    var curEl = document.createElement('span');
    var primeNumbers = [2];

    function fillContent() {
        var primeNumbersContent = document.createTextNode(JSON.stringify(primeNumbers));
        curEl.appendChild(primeNumbersContent);
        cont.appendChild(curEl);
    }

    function isPrime(n) {
        var divisor = 2;
        while (n > divisor) {
            if (Math.pow(divisor, 2) > n) {
                return true;
            }
            if (n % divisor == 0 || Math.sqrt(divisor) > n) {
                return false;
            } else {
                divisor++;
            }
        }
        return true;
    }

    function getPrimeNumbers(range) {
        for (var i = 3; i <= range; i+=2) {
            if (isPrime(i)) {
                primeNumbers.push(i);
            }
        }
        fillContent(primeNumbers);
    }
    getPrimeNumbers(11);
  })();
};
于 2015-12-30T14:47:34.027 回答
0

这是我使用埃拉托色尼筛法的解决方案:

function gimmePrimes(num) {
  numArray = [];
  // first generate array of numbers [2,3,...num]
  for (i = 2; i <= num; ++i) {
    numArray.push(i);
  }

  for (i = 0; i < numArray.length; ++i) {
    //this for loop helps to go through each element of array

    for (j = numArray[i]; j < numArray[numArray.length - 1]; ++j) {
      //get's the value of i'th element
      for (k = 2; j * k <= numArray[numArray.length - 1]; ++k) {
        //find the index of multiples of ith element in the array
        index = numArray.indexOf(j * k);
        if (index > -1) { //remove the multiples
          numArray.splice(index, 1);
        }
      }

    }
  }
  return numArray; //return result
}
gimmePrimes(100);
于 2016-01-19T10:01:10.393 回答
0
function isPrime(num) {
  for(var i = 2; i < num; i++)
    if(num % i === 0) return false;
  return num ;
}
function primes(n){
  var array_of_primes=[];
for(var i = 2; i < n; i++){
    if(isPrime(i)) array_of_primes.push(i)>1;
     }
   return array_of_primes;
}
document.write(primes(10000));
于 2020-05-31T16:05:54.720 回答
-1
<html>
<head>
<script type="text/javascript">
function primeNumber() {
 x=document.getElementById('txt_field').value;
  for (i=1; i<=parseInt(x); i++) {
  var flag=0,flag1=0; 
    for (j=2; j<i; j++) {
      if(i%j==0){
       flag=1;
      if(i==x)
       flag1=1;
      }
    }
   if(flag==0)
    document.write(i+'<br>');
  }
   if(flag1==0) 
    document.write('Its a prime number.');
   else 
    document.write('Its not a prime number.');
}
</script>
</head>

<body>
 <input id="txt_field" type="text" name="field" />
 <input type="button" name="submit" value="Submit" onclick="primeNumber();" />
</body>
</html>
于 2013-07-19T05:06:16.500 回答
-1

有人试过这个吗?它简单高效...

function Prime(num) {
  if (num <= 2)return false;
  for(var i = 2; i < num; i++){
    if (num % i == 0) return false;
  }
  return true;
}

function PrimeWithin(userinput){
  for(var i = 2; i < userinput; i++){
    if(Prime(i)){
        console.log(i);
    }
  }
}

PrimeWithin(500);
于 2014-11-19T14:04:07.027 回答