提问人:Michael Kolesidis 提问时间:4/20/2022 更新时间:4/20/2022 访问量:156
For 循环,其中计数器上升到 Math.floor() 生成的值
For loop in which the counter goes up to a value generated by 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() 可以帮助我解决这个问题。
关于为什么这不起作用以及可以做些什么的任何想法?谢谢!
答:
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 != i
numberOfDivisors
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);
}
}
评论