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

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

提问人:Michael Kolesidis 提问时间:4/20/2022 更新时间:4/20/2022 访问量:156

问:

我是一名新的 Web 开发人员,学习 Web 开发大约 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() 可以帮助我解决这个问题。

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

JavaScript for 循环 数学 点精度

评论

5赞 Aioros 4/20/2022
你能举一个例子来说明这些意想不到的结果吗?

答:

1赞 mstephen19 4/20/2022 #1

试试这个。

// 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);

0赞 Liswin 4/20/2022 #2

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

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