我必须获得一系列素数。但我的代码不起作用。怎么可能修复它?
var num1 = parseInt(prompt('Enter a number'));
var num2 = parseInt(prompt('Enter a number'));
var num3 = 0;
function primeSeq(num1, num2) {
var b = 1;
var c = '';
if (num1 > num2) {
num3 = num2;
num2 = num1;
num1 = num3;
}
for (var i = num1; i < num2; i++) {
for (var j = 2; j < i; j++) {
if (i % j == 0) {
b++;
}
if (b <= 1) {
c += i + ' ';
}
}
}
return c;
}
alert(primeSeq(num1, num2));
答案 0 :(得分:1)
我想你想要这样的东西
var num1 = parseInt(prompt('Enter a number'));
var num2 = parseInt(prompt('Enter a number'));
var num3 = 0;
if (num1 > num2) {
num3 = num2;
num2 = num1;
num1 = num3;
}
function primeSeq(num1, num2) {
var b;
var c = '';
for (var i = num1; i < num2; i++) {
b = 1;
for (var j = 2; j < i; j++) {
if (i % j === 0) {
b++;
}
}
if (b === 1) {
c += i + ' ';
}
}
return c;
}
alert(primeSeq(num1, num2));
简而言之,b
应该在每个新的主要候选者(i
循环)上重置为1,并且b
的检查应该在内部(j
)循环之外
请注意,有更多优化算法。
答案 1 :(得分:1)
更简单的方法是使用筛分系统,如果一个数字可以被另一个质数整除,则它不是质数。您可以编写如下函数:
function primes(max) {
let primes = [2];
for (let i = 3; i <= max; i++) {
let found = true;
for (let j = 0; j < primes.length; j++) {
if (i % primes[j] == 0) found = false;
}
if (found) primes.push(i);
}
return primes;
}
说明
默认情况下,您知道2是质数,所以您从3开始。您不想执行最大值,即i <= max
语句。假设它是一个素数,然后在数组中搜索是否可以被您之前发现的素数整除(如果是),则将found设置为false。
现在检查是否找到了,将数组压入数组并返回素数。
答案 2 :(得分:0)
这是更优化的算法:
function primeSeq(num1, num2) {
var primes = [];
var isPrime;
var j;
var results = [];
for (var i = 2; i < num2; i++) {
isPrime = true;
j = 0;
while (j < primes.length) {
if (i % primes[j] === 0) {
isPrime = false;
break;
}
j++;
}
if (isPrime) {
primes.push(i);
if (i >= num1) {
results.push(i);
}
}
}
return results.join(' ');
}
为了使数字成为素数,它必须不能用所有较小的素数分割,因此我们生成一个primes
数组来检查。
还有一个理论认为,每个大于3的素数都有以下形式:
6k+1 or 6k-1
所以这会简化它。
答案 3 :(得分:0)
尝试这个
Template.theTemplate.onCreated(function onCreated() {
this.someNumber = new ReactiveVar(42); // changing this will cause a new run
});
Template.theTemplate.helpers({
someVar() {
return Template.instance().someNumber.get();
}
});