使用比此更简单的代码将素数从2计数到100

时间:2012-10-12 04:42:20

标签: javascript primes

它必须只有函数,变量,循环等(基本的东西)。从目前为止我学到的东西(从应该能够做到)开始,我无法从头开始编写代码。让我真的很生气:/。 如果你能一步一步地给我,以确保我明白我真的很感激。非常感谢你们。

我怎么能用比这个更简单的代码得到相同的结果:

var primes=4; 
for (var counter = 2; counter <= 100; counter = counter + 1)
{
    var isPrime = 0;
    if(isPrime === 0){ 
        if(counter === 2){console.log(counter);} 
        else if(counter === 3){console.log(counter);} 
        else if(counter === 5){console.log(counter);} 
        else if(counter === 7){console.log(counter);} 
        else if(counter % 2 === 0){isPrime=0;} 
        else if(counter % 3 === 0){isPrime=0;} 
        else if(counter % 5 === 0){isPrime=0;} 
        else if(counter % 7 === 0){isPrime=0;}
        else {
            console.log(counter);
            primes = primes + 1;
        }
    }
}
console.log("Counted: "+primes+" primes");

6 个答案:

答案 0 :(得分:7)

我今天感觉很顽皮:

function printPrimesBetweenTwoAndOneHundredSimply(){

   var primes = [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],
   i,
   arrayLength = primes.length;

   for(i = 0; i < arrayLength; i++){
     console.log(primes[i]);
   }

   console.log("Counted: " + arrayLength + " primes");
}

答案 1 :(得分:4)

首先,您实际上不需要使用===。标准==就足够了。其次,除了将一个数字分成一行之外,你可以将所有这些行都做成相同的事情:

var primes=4; 
for (var counter = 2; counter <= 100; counter = counter + 1)
{
    var isPrime = 0;
    if(isPrime == 0){ 
        if(counter == 2 || counter == 3 ||counter == 5 || counter == 7)console.log(counter);
        else if(counter % 2 == 0 || counter % 3 == 0 || counter % 5 == 0 || counter % 7 == 0)isPrime=0; 
        else {
            console.log(counter);
            primes = primes + 1;
        }
    }
}
console.log("Counted: "+primes+" primes");

您还会注意到{}已删除几行。这是因为if(以及其他)之后的单行代码始终被视为嵌套。

接下来,我们可以将您的primes = primes + 1;更改为:primes++;,它只会告诉primes将自己增加1。您的柜台也可以这样做。我们也知道isPrime等于“0”,因为你在一秒钟前将它设置为,所以我们不再需要if语句:

var primes=4; 
for (var counter = 2; counter <= 100; counter++)
{
    var isPrime = 0;
    if(counter == 2 || counter == 3 ||counter == 5 || counter == 7)console.log(counter);
    else if(counter % 2 == 0 || counter % 3 == 0 || counter % 5 == 0 || counter % 7 == 0)isPrime=0; 
    else {
        console.log(counter);
        primes++;
    }
}
console.log("Counted: "+primes+" primes");

接下来,我们可以对值进行否定检查(!=而不是==),并将else ifelse合并。由于我们正在进行否定检查(针对此情况),我们必须将OR s(||)切换为AND s(&&):

var primes=4; 
for (var counter = 2; counter <= 100; counter++)
{
    if(counter == 2 || counter == 3 ||counter == 5 || counter == 7)console.log(counter);
    else if(counter % 2 != 0 && counter % 3 != 0 && counter % 5 != 0 && counter % 7 != 0) {
        console.log(counter);
        primes++;
    }
}
console.log("Counted: "+primes+" primes");

还有很多其他方法可以写它,但我觉得使用你开始使用的东西并从那里缩短它会对你有所帮助。

答案 2 :(得分:1)

这会找到2到100之间的所有素数:

var primes=0; 
var isprime = true;
for (var counter = 2; counter <= 100; counter = counter + 1)
{
    // For now, we believe that it is a prime
    isprime = true;
    var limit = Math.round(Math.sqrt(counter)); // See comment from @AresAvatar, below
    // We try to find a number between 2 and limit that gives us a reminder of 0
    for (var mod = 2; mod <= limit; mod++) {
        // If we find one, we know it's not a prime
        if (counter%mod == 0) {
            isprime = false;
            break; // Break out of the inner for loop
        }
    }

    if (isprime) {
        console.log(counter, limit);
        primes = primes + 1;
    }
}
console.log("Counted: "+primes+" primes");

答案 3 :(得分:0)

当然,“更简单”没有定义。 : - )

以下内容可以缩短得多,但内置了一些健壮性。

// Get primes from 0 to n. 
// n must be < 2^53
function primeSieve(n) {

  n = Number(n);
  if (n > Math.pow(2, 53) || isNaN(n) || n < 1) {
    return;
  }

  var primes = [];
  var notPrimes = {};
  var num;

  for (var i=2; i<n; i++) {
    for (var j=2; j<n/2; j++) {
      num = i*j;
      notPrimes[num] = num;
    }
    if (!(i in notPrimes)) {
      primes.push(i);
    }
  }
  return primes
} 

所以如果你想要更少的代码:

// Get primes from 0 to n. 
// n must be < 2^53
function primeSieve2(n) {
  var primes = [], notPrimes = {};
  for (var i=2; i<n; i++) { 
    for (var j=2; j<n/2; j++)
      notPrimes[i*j] = i*j;
    i in notPrimes? 0 : primes.push(i);
  }
  return primes
}

答案 4 :(得分:0)

这很简单(我的意思是,简称):

console.log(2); console.log(3);
var m5=25, m7=49, i=5, d=2, c=2;
for( ; i<100; i+=d, d=6-d )
{
    if( i!=m5 && i!=m7) { console.log(i); c+=1; }
    if( m5 <= i ) m5+=10;
    if( m7 <= i ) m7+=14;
}
c

这是sieve of Eratosthenes的“展开”2-3-wheel factorization

一方面,我们列举了与2和3相互作用的100以下(并且大于3)的所有数字,作为5 + 2 + 4 + 2 + 4 + ...的部分和,所以那里在这样列举的数字中不是2和3的倍数。

另一方面,我们从它们中删除所有5和7的倍数,将它们列为25 + 10 + 10 + 10 + ...和49 + 14 + 14 + 14 +的部分和。 ......首先不存在2和3的倍数,并且需要被Eratosthenes筛子丢弃的11的第一个倍数是121.

答案 5 :(得分:-3)

这对你的问题来说会更简单....

 for (int i = 2; i < 100; i++) {
int j = 0;
for (j = 2; j < i; j++)
    if ((i % j) == 0)break;
        if (i == j)
        System.out.print("  " + i);}