For 循环,其中计数器上升到 Math.floor() 生成的值

For loop in which the counter goes up to a value generated by Math.floor()

我是一名网络开发新手,学习网络开发已有 8-9 个月左右。我最近成为了我毕业的训练营新生的导师,我想编写一个简单的程序来计算给定上限的所有素数。我已经用 C、C++ 和 Python 解决了完全相同的问题。我使用的是“朴素”的实现,而不是埃拉托色尼筛法。

这是有效的代码:

"use strict";

function primeNumbers() {
  let highNumber;

  highNumber = window.prompt("Calculate all prime numbers up to:");

  for (let i = 2; i <= highNumber; i++) {
    let numberOfDivisors = 0;

    for (let j = 2; j < highNumber; j++) {
      if (i % j == 0) numberOfDivisors += 1;
    }
    if (numberOfDivisors == 1) console.log(i);
  }
}

当然j不一定非得一直到highNumber,任何一个数,所有可能的约数都小于该数的一半。因此,我更改了内部 for 循环,使 j 仅达到 Math.round(highNumber / 2 + 1):

"use strict";

function primeNumbers() {
  let highNumber;

  highNumber = window.prompt("Calculate all prime numbers up to:");

  for (let i = 2; i <= highNumber; i++) {
    let numberOfDivisors = 0;

    for (let j = 2; j < Math.round(highNumber / 2 + 1); j++) {
      if (i % j == 0) numberOfDivisors += 1;
    }
    if (numberOfDivisors == 1) console.log(i);
  }
}

但这会以某种方式破坏代码并导致意外结果。我知道 JavaScript 中的所有数字在技术上都是浮点数,但我认为使用 Math.floor() 会帮助我处理这个问题。

关于为什么这不起作用以及可以做什么的任何想法?谢谢!

试试这个。

// Utility function to create a range starting from 2
const range = (num: number) => [...Array(num + 1).keys()].slice(2);

const primeNumbers = (limit: number) => {
    // Create a range based on the limit
    const arr = range(limit);
    
    // Create an array for the prime numbers which will be returned.
    // Hardcode 1
    const prime: number[] = [1];

    // Loop through the range
    for (const x of arr) {
        // Create an array of divisors by filtering through
        // new range based on x
        const divisors = range(x).filter((num) => !(x % num));

        // If there is only 1 divisor and it === x, it is prime
        if (divisors.length === 1 && divisors[0] === x) prime.push(x);
    }

    return prime;
};

console.log(primeNumbers(50).length);

这是编译后的 TypeScript:

"use strict";
const range = (num) => [...Array(num + 1).keys()].slice(2);
const primeNumbers = (limit) => {
    const arr = range(limit);
    const prime = [1];
    for (const x of arr) {
        const divisors = range(x).filter((num) => !(x % num));
        if (divisors.length === 1 && divisors[0] === x)
            prime.push(x);
    }
    return prime;
};
console.log(primeNumbers(50).length);

一个数字总是有两个约数,1 和数字本身。 j != i 将确保不会发生不必要的计算。我已在声明中将 numberOfDivisors 初始化为 2。当我们迭代时,我们检查 numberOfDivisors 是否进一步增加。如果是,那不是素数。

"use strict";

function primeNumbers() {
  let highNumber;

  highNumber = window.prompt("Calculate all prime numbers up to:");

  for (let i = 2; i <= highNumber; i++) {
    let numberOfDivisors = 2;
    for (let j = 2; j < Math.round(highNumber / 2 + 1), j != i; j++) {

      if (i % j == 0) numberOfDivisors += 1;
    }
    if (numberOfDivisors == 2) console.log(i);
  }
}