设计一个算法来接收正数 n,并输出所有小于 n 的素数 并且有数字 7。例如,如果 n 为 100,则程序应输出 7、17、37、47、67、71、73、79 和 97。
程序卡住而不给出输出
function P6() {
var n = parseInt(prompt("Please enter a value"));
for (var i = 2; i <= n; i++) {
if (prime(i) && has7(i)) {
alert(i);
}
}
}
function prime(s) {
var flag = true;
var d = 2;
while (flag == true && d <= s / 2) {
if (s % d == 0) {
flag = false;
}
d = d++;
}
return flag;
}
function has7(v) {
var has7 = false;
var length = Math.log(v) + 1;
for (var i = 1; i <= length; i++) {
var last = v % 10;
if (last == 7) {
has7 = true;
}
v = v % 10
}
return has7;
}
最佳答案
这一行是错误的:
d = d++;
d++
是后递增,它递增变量,但计算结果为旧值。因此,当您将结果分配回变量时,它会将其设置回原始值。结果,你就陷入了无限循环。
应该是:
d = d + 1;
或者只是:
d++;
另一个错误是:
v = v % 10;
这应该将 v
除以 10,但它只是将 v
设置为其最后一位数字。应该是:
v = Math.floor(v / 10);
在下面的代码中,我简化了所有循环。它们不是设置变量并继续循环,而是在循环确定答案后立即返回。如果循环结束而没有返回,则它们返回相反的值。
function P6() {
var n = parseInt(prompt("Please enter a value"));
for (var i = 2; i <= n; i++) {
if (prime(i) && has7(i)) {
console.log(i);
}
}
}
function prime(s) {
for (var d = 2; d <= s / 2; d++) {
if (s % d == 0) {
return false;
}
}
return true;
}
function has7(v) {
while (v != 0) {
var last = v % 10;
if (last == 7) {
return true;
}
v = Math.floor(v / 10);
}
return false;
}
P6();
关于javascript - 素数子算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59079161/