设计一个算法来接收正数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)) {
alert(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();