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



我是一个新的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()可以帮助我处理这个问题。

有什么想法,为什么这不起作用,可以做些什么?谢谢!

试试这个

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

最新更新