簡體   English   中英

用JS查找素數序列

[英]Finding sequence of prime numbers with JS

我必須得到一個質數序列。 但是我的代碼不起作用。 怎么可能修復它?

var num1 = parseInt(prompt('Enter a number'));
var num2 = parseInt(prompt('Enter a number'));
var num3 = 0;
function primeSeq(num1, num2) {  
var b = 1;
var c = '';
if (num1 > num2) {
num3 = num2;
num2 = num1;
num1 = num3;
        }
for (var i = num1; i < num2; i++) {
for (var j = 2; j < i; j++) {
if (i % j == 0) {
b++;
}
if (b <= 1) {
c += i + ' ';               
}
}
}
return c;
}
alert(primeSeq(num1, num2));

我猜你想要這樣的東西

var num1 = parseInt(prompt('Enter a number'));
var num2 = parseInt(prompt('Enter a number'));
var num3 = 0;
if (num1 > num2) {
  num3 = num2;
  num2 = num1;
  num1 = num3;
}
function primeSeq(num1, num2) {  
  var b;
  var c = '';
  for (var i = num1; i < num2; i++) {
    b = 1;
    for (var j = 2; j < i; j++) {
      if (i % j === 0) {
        b++;
      }
    }     
    if (b === 1) {
      c += i + ' ';               
    }
  }
  return c;
}
alert(primeSeq(num1, num2));

所以簡而言之, b應該在每個新的主要候選者( i循環)上重置為 1 並且對b檢查應該在內部( j )循環之外。

請注意,還有更多最佳算法。

更簡單的方法是使用篩分系統,如果一個數可以被另一個素數整除,它就不是素數。 你可以寫一個這樣的函數:

function primes(max) {
    let primes = [2];
    for (let i = 3; i <= max; i++) {
        let found = true;
        for (let j = 0; j < primes.length; j++) {
            if (i % primes[j] == 0) found = false;
        }
        if (found) primes.push(i);
    }
    return primes;
}

說明

默認情況下,您知道 2 是素數,因此您從 3 開始。您不想超出最大值,即i <= max語句。 假設它是一個素數,然后在數組中搜索它是否可以被您之前找到的素數整除,如果是這樣,則將 found 設置為 false。 現在檢查是否找到了,推送到數組並返回素數。

這是更優化的算法:

function primeSeq(num1, num2) {
  var primes = [];
  var isPrime;
  var j;
  var results = [];

  for (var i = 2; i < num2; i++) {
    isPrime = true;
    j = 0;
    while (j < primes.length) {
      if (i % primes[j] === 0) {
        isPrime = false;
        break;
      }
      j++;
    }
    if (isPrime) {
      primes.push(i);
      if (i >= num1) {
        results.push(i);
      }
    }
  }
  return results.join(' ');
}

為了使數字成為素數,它不能與所有較小的素數相除,因此我們生成了一個primes數組進行檢查。 還有一種理論認為每個大於 3 的質數都有以下形式:

6k+1 or 6k-1

所以這會更簡化它。

試試這個

<input ng-model="range" type="number" placeholder="Enter the range">
 <button ng-click="findPrimeNumber(range)">


    $scope.findPrimeNumber=function(range){
         var tempArray=[];
         for(var i=0;i<=range;i++){
            tempArray.push(i)
         }
         var primenumbers= tempArray.filter((number) => {
         for (var i = 2; i <= Math.sqrt($scope.range); i++) {
            if (number % i === 0) return false;
          }
          return true;
         });
         console.log(primenumbers);

     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM