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);
}
}
我是一名网络开发新手,学习网络开发已有 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);
}
}