我是一个新的网页开发人员,学习网页开发大约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()可以帮助我处理这个问题。
对于为什么这不起作用,有什么想法可以做吗?谢谢!
发布于 2022-04-19 18:25:36
一个数字总是有两个除数,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);
}
}
https://stackoverflow.com/questions/71928883
复制相似问题